【问题标题】:How to make a left join query in Django ORM如何在 Django ORM 中进行左连接查询
【发布时间】:2022-01-05 00:42:20
【问题描述】:

我的模型:

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 |

我想从ratings_rating 中获取posts_post 表的内容以及相应的rating 值,以获取相同的content_id 和一个user_id,我将从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 模型的新手,我知道我可以为此使用原始查询,但我想知道更好的方法和可接受的方法。 非常感谢!

【问题讨论】:

    标签: python django postgresql django-models django-rest-framework


    【解决方案1】:

    我猜你也有一个内容模型。如果是这样,您可以根据 id 过滤内容,然后从内容对象中获取帖子和评分。请参阅文档示例 (https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_one/) 了解如何执行此操作。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2018-04-08
      • 2020-05-18
      • 2018-05-21
      • 2017-06-30
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多