14 votes

Many to many et comment obtenir un queryset de queryset

J'ai les modèles suivants :

class Product(models.Model):
    name = CharField(max_length=30)

class Store(models.Model):
    name = CharField(max_length=30)
    product = models.ManyToManyField(Product)

Comment obtenir Store avec le produit nommé product_name et aussi, obtenir tous les produits (sauf le produit avec le nom product_name ) ? Est-il possible de le faire en une seule requête ? En SQL brut, ce serait simple JOIN s. Je ne sais pas comment l'implémenter via Django.

22voto

miki725 Points 6976

Vous pouvez réellement faire ces choses avec Django grâce à l'évaluation paresseuse des querysets. La méthode de Django in La recherche de champ accepte à la fois les listes et les querysets. Ce qui suit va créer un code SQL imbriqué :

products = Product.objects.filter(store_set__in=stores_qs)
stores_qs = Store.objects.filter(product__name='product_name')

Ici sont le Django in docs.

7voto

jondykeman Points 914

Vous devriez être en mesure de filtrer les magasins en fonction d'un attribut de produit, puis de prélever des objets apparentés aux objets récupérés.

Store.objects.filter(product__name="product_name").prefetch_related('product')

Cela devrait permettre de frapper la base de données le moins de fois possible pour obtenir ce que vous recherchez - deux fois.

D'autres documents sont disponibles aquí .

1voto

UnLiMiTeD Points 990

Obtenir les magasins avec le produit nommé "nom_produit" :

Store.objects.filter(product__name='product_name')

Obtenir tous les produits sauf le produit avec le nom "nom_produit" :

Product.objects.exclude(name='product_name')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X