2017-02-24 5 views
0

だが、私は様々な子製品を持つことができ、製品を持って、そしてモデルは私の目標を取得することで、このジャンゴ

class Country(models.Model): 
    name = models.CharField() 

class Product(models.Model): 
    parent = models.ForeignKey(
     'self', null=True, blank=True, related_name='children') 
    name = models.CharField() 
    countries = models.ManyToManyField(Country) 

のように定義されているとしましょう1つのクエリにネストに多くの多くの関係に基づいてクエリセットをフィルタリングする方法特定の国にリンクされている1つまたは複数のの製品を持つすべての製品。

私の場合、この情報はQuerysetとして必要です。私が試してみましたことは、これをされ、それは動作します:

valid_products = [] 
desired_country = Country.objects.get(name='mycountry') 
for product in Product.objects.all(): 
    for child in product.children.all(): 
     countries = child.countries.all() 
     for country in countries: 
      if country == desired_country: 
       valid_products.append(product.id) 
desired_queryset = Product.objects.filter(pk__in=valid_products) 

この方法では、必要とし、追加のクエリは、クエリセットに私の結果を変換するために、私はそれを避けるためにしたいと思います。

このようなクエリーセットをDjango ORMで直接フィルタリングすることはできますか?

答えて

4

二重アンダースコアの構文を使用してリレーションを単純に追跡できます。 So:

desired_queryset = Product.objects.filter(children__countries= desired_country)