Как сделать запрос с левым объединением в 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
вместе с соответствующими значениями rating
из ratings_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, и я знаю, что могу использовать необработанные запросы для этого, но я хочу знать лучший способ и приемлемый способ сделать это. Большое спасибо!
Я предполагаю, что у вас также есть модель Content. Если это так, вы можете фильтровать содержимое на основе id, а затем получить пост и рейтинг из объекта content. Смотрите пример в документации (https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_one/), как это сделать.