Как получить объект с наибольшим количеством связанных объектов в django

#django #django-models #django-orm

#django #django-модели #django-orm

Вопрос:

У меня есть модель A (Post):

 class Post(models.Model):
    title = models.CharField(max_length=30)
  

и модель B (например):

 class Like(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
  

Как мне получить объект Post с наибольшим количеством лайков?

Ответ №1:

Вы можете пометить Post объект количеством лайков, а затем получить .earliest() [Django-doc], когда мы упорядочиваем количество лайков в порядке убывания:

 from django.db.models import Count

most_liked_post = Post.objects.annotate(
    num_likes=Count('like')
).earliest('-num_likes')  

Комментарии:

1. Хорошо, мне нужно будет откуда-то импортировать Count()?

2. И не является .earlest(), чтобы найти самые ранние созданные объекты?

3. @svoruganti: нет. На самом деле база данных не отслеживает, когда вы создали запись. Вы можете сделать это, добавив временную метку или что-то в этом роде. Но .earliest(...) в основном заказы по предоставленным полям и возвращает первое .

4. Хорошо, большое спасибо, но откуда мне импортировать Count()?

5. @svoruganti: вместо .earliest() , .order_by('-num_likes')[:10] .