"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment répliquer la fonction GROUP_CONCAT de MySQL dans Django ?

Comment répliquer la fonction GROUP_CONCAT de MySQL dans Django ?

Publié le 2025-01-21
Parcourir:181

How to Replicate MySQL\'s GROUP_CONCAT Function in Django?

Équivalent Django du GROUP_CONCAT de MySQL

Dans un projet Django, vous pouvez exécuter une requête pour récupérer un nombre de types différents et une virgule- liste délimitée de leurs noms. Bien que MySQL propose la fonction GROUP_CONCAT pour cette tâche, trouver son équivalent Django peut être délicat.

Supposons qu'il existe une table nommée 'fruits' :

idtypenom
0pommefuji
1pommemac
2orangenombril

Le sortie souhaitée est :

typecomptenom
pomme2"fuji,mac"
orange1"nombril"

Coutume Fonction d'agrégation

Pour y parvenir sans requêtes SQL brutes, créez une fonction d'agrégation personnalisée dans Django.

Ajoutez le code suivant à votre projet :

from django.db.models import Aggregate

class Concat(Aggregate):
    function = 'GROUP_CONCAT'
    template = '%(function)s(%(distinct)s%(expressions)s)'

    def __init__(self, expression, distinct=False, **extra):
        super(Concat, self).__init__(
            expression,
            distinct='DISTINCT ' if distinct else '',
            output_field=CharField(),
            **extra)

Utilisation

Utilisez la fonction d'agrégation personnalisée comme ceci :

query_set = Fruits.objects.values('type').annotate(
    count=Count('type'),
    name=Concat('name')
).order_by('-count')

Cette requête renverra un QuerySet avec le résultat souhaité.

Exemple de sortie

Pour les 'fruits' ', le query_set contiendra :

{
    'type': 'apple',
    'count': 2,
    'name': 'fuji,mac'
},
{
    'type': 'orange',
    'count': 1,
    'name': 'navel'
},

Conclusion

En créant une fonction d'agrégation personnalisée, vous pouvez facilement obtenir une fonctionnalité de type GROUP_CONCAT dans Django, permettant de récupérer un nombre de valeurs différentes et une liste délimitée par des virgules de noms ou de valeurs associés provenant d'une table de base de données.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3