2017-05-01 6 views
1

JOINを私は2つのモデル、ジャンゴ:LEFTのより良い実装が

class Post(models.Model): 
    id = models.IntegerField(primary_key=True) 
    post_title = models.CharField() 
    post_type = models.CharField() 

class Comments(models.Model): 
    id = models.IntegerField(primary_key=True) 
    post = models.ForeignKey(Post, related_name="post_comments") 
    comment = models.CharField() 
    user_id = models.IntegerField() 

を持っている私は、特定のユーザーのコメントと一緒にpost_type「ブログ」と「すべて」の記事を取得したいです。生のクエリでそれをやっている場合、クエリは上記のクエリがどのように私は、この使用後のオブジェクトを実装することができますuser_idを20でのコメントと一緒に「ブログ」としてpost_typeを持つすべての投稿を返します

SELECT p.id as post_id, p.post_title, pc.comment 
FROM Post p 
LEFT JOIN Comments pc ON (p.id=pc.post AND pc.user_id=20) 
WHERE p.post_type='blog' 

、このようになりますdjangoのフィルタ?

私は腹を立てる方法を試みたが、それは仕事をしなかった。

queryset = Post.objects.filter(post_type='blog', post_comments__user_id=20).all() 

私はたくさんのグーグルで探っていましたが、私はこのための良い解決策を見つけることができませんでした。

答えて

0

あなたはこれを見ましたか? https://docs.djangoproject.com/en/1.11/topics/db/queries/#spanning-multi-valued-relationshipsstr(Post.objects.filter(post_type='blog', post_comments__user_id=20).query)

私の推測では、あなたがこの使用する必要がありますされています:あなたは、生のSQL Djangoはあなたが印刷する場合に実行かを見ることができます

あなたは「ブログ」として、すべてのpost_typeを返すようにしたい場合は Post.objects.filter(post_type='blog').filter(post_comments__user_id=20)

+0

を行うことができます私はDjangoのOを使用してデータを取得したい、クエリを印刷したくありませんフィルタの方法をbjects。 –

+0

私は、あなたがデバッグの目的のためにクエリを印刷することができます理解して、そのフィルタを使用して生成されたsql djangoを参照してください。 –

+0

内部結合クエリを出力します。 –

0

をし、 user_id 20commentsその後、このクエリに

from django.db.models import Q 

Post.objects.filter(Q(post_type='blog') | Q(post_comments__user_id=20)) 
関連する問題