2011-09-09 10 views
1

に参加し、次のモデルを考えてみましょう:私はに似たクエリを実行するとDjangoのモデルの値() 'とLEFT OUTERは

class Product(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 

class Provider(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 
    product = models.ForeignKey(Product) 

class Customer(models.Model): 
    name = models.CharField(max_length=100, blank=False, null=False) 
    product = models.ForeignKey(Product) 

Product.objects.values('name', 'provider__name', 'customer__name') 

を生成したSQLは、LEFT OUTERジョインの代わりに使用していますINNERは参加します。 filterではINNER JOINを使用しています。 values()を使用して、LEFT OUTER結合によって誘導される不要なNULLフィールドフィルタリングを回避するにはどうすればよいですか?

filter()/values()機能の動作に違いがあるのはなぜですか?

+0

Product.objects.all()を使用するとどうなりますか?select_related()? – fabrizioM

+0

残念ながら 'select_related()'は逆の関係をカバーしていません – Xyand

答えて

1

あなたは、このような値の後にフィルタを使用することができます。

Product.objects.values('name', 'provider__name', 'customer__name').filter(provider__name__isnull=False) 

私は100%を確認していないが、それを試してみます!と知っている!

+0

それはトリックです。しかし、結果のクエリはあまり効率的ではないようです。 LEFT OUTER JOINを使用して、INNER JOINではなくWHERE句を使用して結果をフィルタリングします。私はその解決策を認識していますが、よりよいものがあることを願っています。私の場合、BTW、 'provider__name__isnull = False'。 – Xyand

関連する問題