2012-03-21 3 views
2

J'ai deux objets de même type (modèle). Je veux vérifier une intersection sur un champ M2M. Existe-t-il un moyen efficace de le faire sans utiliser le SQL brut?Un moyen efficace de vérifier une intersection M2M dans Django?

Voici, fondamentalement, ma solution actuelle.

genres_a = [g for g in profile_a.genres.all()] # Convert to List 
genres_b = set([g for g in profile_b.genres.all()]) # Convert to Set 

if genres_b.intersection(genres_a): # Look for Intersection (Not Lazy) 
    print True # Do something... 
+0

double possible de [? Comment Intersection entre deux champs ManyToMany avec Django Recherche] (http://stackoverflow.com/questions/8129431/how- to-intersect-two-manytomany-fields-with-a-django-query) – jterrace

+0

Peut-être, mais je ne demandais pas forcément comment croiser deux champs M2M - plutôt à la recherche d'un moyen efficace d'effectuer l'opération. – Kurtis

Répondre

1

Si je comprends bien l'intersection:

profile_a.genres.all().filter(id__in=profile_b.genres.all()) 
+0

Merci! Je vais essayer, avec un peu de temps, pour voir si c'est plus efficace. J'ai juste besoin d'ajouter un .exists() à la fin de cela pour l'utiliser dans ma déclaration 'if', non? – Kurtis

+1

Je ne suis pas sûr si c'est plus efficace, mais cela dit à la base de données fait le produit cartésien, et oui vous devez ajouter .exists() pour tester si le sql a des résultats – diegueus9

Questions connexes