Sélection de lignes avec des valeurs de champ en double dans Django
Considérez un modèle Django avec un champ de nom non unique qui autorise les valeurs en double. Pour sélectionner toutes les lignes avec au moins une valeur en double du champ de nom, on peut explorer les approches ORM et SQL.
Approche ORM de Django
Utilisant les capacités d'agrégation de Django, on peut réaliser cette tâche avec l'expression ORM suivante :
from django.db.models import Count Literal.objects.values('name') .annotate(Count('id')) .order_by() .filter(id__count__gt=1)
Cette expression regroupe les instances du modèle par nom, compte le nombre des occurrences de chaque nom et filtre les résultats pour inclure uniquement les noms avec des instances en double.
Approche ORM Django améliorée
Bien que l'approche ORM précédente fournisse les fonctionnalités nécessaires, il renvoie uniquement les informations de nom et de nombre. Pour obtenir les enregistrements réels, on peut construire un QuerySet régulier basé sur les noms en double trouvés :
dupes = Literal.objects.values('name') .annotate(Count('id')) .order_by() .filter(id__count__gt=1) Literal.objects.filter(name__in=[item['name'] for item in dupes])
Approche SQL
Pour ceux qui préfèrent une solution SQL pure, la requête suivante produirait les résultats souhaités :
select * from literal where name IN ( select name from literal group by name having count((name)) > 1 );
Cette requête utilise une sous-requête pour rechercher les noms en double, puis sélectionne toutes les lignes du table principale où le nom correspond à l'un des doublons.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!