[英]How to create equivalent LEFT JOIN query in Django's ORM (1.11)
[英]How to make a left join query in Django ORM
我的模型:
class Post(models.Model):
user = models.ForeignKey(BucketUser, on_delete=models.CASCADE)
content = models.ForeignKey(Content, on_delete=models.CASCADE, blank=True, null=True)
resource_type = models.CharField(max_length=150)
url = models.URLField()
text = models.TextField()
class Rating(models.Model):
user = models.ForeignKey(BucketUser, on_delete=models.CASCADE)
content = models.ForeignKey(Content, on_delete=models.CASCADE)
rating = models.IntegerField(choices=rating_choices, default='1')
PostgreSQL 表:
posts_post :
| id | url | resource_type | text | content_id | user_id |
ratings_rating :
| id | rating | content_id | user_id |
我想获取posts_post
表的内容以及从ratings_rating
获取相同content_id
和user_id
的相应rating
值,我将从 GET 请求中收到。 我可以通过 SQL 查询轻松获得,例如:
SELECT p.*, r.rating FROM posts_post p LEFT JOIN ratings_rating r ON p.content_id = r.content_id AND r.user_id = 100; /* Assuming user_id received was 100 */
或者我什至可以这样做:
SELECT p.*, (SELECT r.rating FROM ratings_rating r WHERE r.content_id = p.content_id AND r.user_id = 100) AS rating FROM posts_post p;
但是,我很困扰如何通过基于模型的 Django ORM 查询来做同样的事情。 或者,如果我需要为此创建新模型? Django 的做法是什么? 我还是 Django 模型的新手,我知道我可以为此使用原始查询,但我想知道更好的方法和可接受的方法。 非常感谢!
我猜你也有一个内容 model 。 如果是这样,您可以根据 id 过滤内容,然后从内容 object 中获取帖子和评分。 请参阅文档示例( https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_one/ )了解如何做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.