2017-08-21 2 views
0

Comment filtrer plusieurs champs plusieurs à plusieurs. par exemple, je l'ai:Django - Filtrage sur plusieurs champs à plusieurs champs

class Category(models.Model): 
    products = models.ManyToManyField(Product) 
    ... 


class Product(models.Model): 
    shippers = models.ManyToManyField(Shipper) 
    manufacturer = models.ForeignKey(Manufacturer) 
    ... 

Avec produits = Product.objects.filter (category = catégorie) je vais obtenir requête avec la liste des produits de la catégorie. Comment obtenir la liste de tous les expéditeurs possibles pour tous les produits de la catégorie? La deuxième question est comment obtenir toutes les instances de fabricants à partir de cette requête.

Maintenant extraction des fabricants ressemble

manufacturer_ids = products.values_list('manufacturer').distinct() 
manufacturers = Manufacturer.objects.filter(id__in=manufacturer_ids) 

Mais je crois que cela devrait être mieux Aussi je n'ai aucune idée comment obtenir la liste de tous les expéditeurs possibles de cette requête.

Répondre

1

Pour obtenir tous les expéditeurs de tous les produits dans une catégorie donnée:

shippers = Shipper.objects.filter(product__category=category) 

Il est possible que cela retourne des valeurs en double, de sorte que vous pouvez appeler .distinct() là-dessus.

Pour obtenir les fabricants plus soigneusement, vous pouvez faire:

manufacturers = Manufacturer.objects.filter(products__in=products) 

D'autre part, il me semble plus judicieux de mettre le champ de catégorie comme un champ ForeignKey sur le modèle Product, plutôt que la dans l'autre sens.