Maison >base de données >tutoriel mysql >Comment puis-je rechercher et récupérer efficacement des lignes avec des valeurs de champ en double dans les modèles Django ?

Comment puis-je rechercher et récupérer efficacement des lignes avec des valeurs de champ en double dans les modèles Django ?

DDD
DDDoriginal
2024-12-28 00:35:10519parcourir

How Can I Efficiently Find and Retrieve Rows with Duplicate Field Values in Django Models?

Interroger les modèles Django pour les valeurs de champ en double

Dans Django, traiter des modèles qui autorisent des valeurs de champ en double peut poser des défis. Considérons un modèle avec un champ de nom non unique. Pour sélectionner des lignes avec des valeurs de nom en double, voici les solutions possibles :

Solution SQL simple

La requête SQL fournie filtre efficacement les lignes avec des noms en double :

select * from literal where name IN (
    select name from literal group by name having count((name)) > 1
);

Solution Django ORM

Alors que Django ORM ne le fait pas fournit une méthode directe pour filtrer les valeurs de champ en double, vous pouvez y parvenir avec une certaine ingéniosité :

from django.db.models import Count

dupes = Literal.objects.values('name')\
                       .annotate(Count('id'))\
                       .order_by()\
                       .filter(id__count__gt=1)

Ce code crée une requête qui regroupe les lignes par leur champ de nom, compte les occurrences de chaque nom unique et filtre pour les lignes avec plus d'une occurrence.

Amélioration de la solution Django ORM

Pour récupérer les lignes réelles modèle d'objets au lieu d'un ensemble de requêtes de valeurs, vous pouvez utiliser l'opérateur in :

Literal.objects.filter(name__in=[item['name'] for item in dupes])

Ce code construit une nouvelle requête qui filtre le modèle littéral par les noms trouvés dans l'ensemble de requêtes dupes.

Cette approche fournit une solution plus proche de celle de Django tout en conservant la précision de la requête SQL simple. Il convient de noter que cette méthode peut avoir des implications sur les performances si le nombre de lignes en double est important. Dans de tels cas, l'utilisation de SQL brut avec des optimisations spécifiques à la base de données peut être plus efficace.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn