繁体   English   中英

如何在 Django ORM 中进行左连接查询

[英]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_iduser_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM