2017-06-06 1 views
1

Je suis nouveau dans django et ORM en général, et ai donc du mal à trouver une requête qui rejoindrait plusieurs tables.Django - joignant plusieurs tables (modèles) et filtrant en fonction de leur attribut

J'ai 4 modèles qui ont besoin d'assemblage - Category, SubCategory, Product et Packaging, des exemples de valeurs seraient:

Category: 'male'

SubCategory: 'shoes'

Product: 'nikeXYZ'

Packaging: 'size_36: 1'

Chacun des modèles ont FK au modèle ci-dessus (c.-à-d. SubCategory a le champ category etc).

Ma question est - comment puis-je filtrer Product donné une Category (par exemple des hommes) et seuls les produits montrent qui ont Packaging attribut available ensemble à True? Évidemment, je veux minimiser les hits sur ma base de données (idéalement le faire avec 1 requête SQL).

que je pouvais faire quelque chose le long de ces lignes:

available = Product.objects.filter(packaging__available=True) 
subcategories = SubCategory.objects.filter(category_id=<id_of_male>) 
products = available.filter(subcategory_id__in=subcategories) 

mais qui nécessite 2 résultats sur la base de données au moins (available, subcategories) Je pense. Y a-t-il un moyen de le faire en une fois?

+0

Qu'en est-il quelque chose comme ceci: Product.objects.filter (packaging__available = True, subcategories__category_id__in = [id_of_male]) - il n'a pas été testé, mais je pense que les sous-catégories devraient être pluriel (related_name). –

Répondre

1

essayez ceci:

lookup = {'packaging_available': True, 'subcategory__category_id__in': ['ids of males']} 
product_objs = Product.objects.filter(**lookup) 
0

Essayez de lire: this Vous pouvez interroger avec _set, __ plusieurs (modèles de liaison par FK) ou créer une liste ids

0

Je pense que cela devrait fonctionner mais il n'a pas été testé:

Product.objects.filter(packaging__available=True,subcategori‌​es__category_id__in=‌​[id_of_male]) 
  • il n'est pas testé mais je pense que les sous-catégories devraient être pluriel (related_name), si vous n'avez pas défini related_name, alors subcategory__set au lieu de subcategories devrait fonctionner.

probablement subcategori‌​es__category_id__in=‌​[id_of_male] peut être commuté à .._id=id_of_male.