É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' :
id | type | nom |
---|---|---|
0 | pomme | fuji |
1 | pomme | mac |
2 | orange | nombril |
Le sortie souhaitée est :
type | compte | nom |
---|---|---|
pomme | 2 | "fuji,mac" |
orange | 1 | "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.
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