Как сделать запрос с левым объединением в 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/), как это сделать.

Вернуться на верх