Django Query: Как заказать сообщения по количеству голосов? - PullRequest
0 голосов
/ 16 декабря 2018

В настоящее время я работаю над сайтом (с Джанго), где люди могут написать историю, за которую могут проголосовать сами или другие люди.Вот классы для Profile, Story и Upvote:

class Profile(AbstractBaseUser, PermissionsMixin):
  email = models.EmailField(unique=True)
  first_name = models.CharField(max_length=30, null=True)
  last_name = models.CharField(max_length=30, null=True)


class Story(models.Model):
  author = models.ForeignKey('accounts.Profile', on_delete=models.CASCADE, related_name="author")
  title = models.CharField(max_length=50)
  content = models.TextField(max_length=10000)


class Upvote(models.Model):
  profile = models.ForeignKey('accounts.Profile', on_delete=models.CASCADE, related_name="upvoter")
  story = models.ForeignKey('Story', on_delete=models.CASCADE, related_name="upvoted_story")
  upvote_time = models.DateTimeField(auto_now=True)

Как видите, Upvote использует два внешних ключа для хранения upvoter и связанной истории.Теперь я хочу сделать запрос, который дает мне все истории, отсортированные по количеству голосов, которые они имеют.Я изо всех сил пытался придумать несколько запросов сам, но это не совсем то, что я ищу.

Этот не работает вообще, так как он просто дает мне все истории вПорядок их создания по какой-то причине.Также он содержит дубликаты, хотя я хочу, чтобы они были сгруппированы по истории.

hot_feed = Upvote.objects.annotate(upvote_count=Count('story')).order_by('-upvote_count')

Это один из видов работ.Но если я пытаюсь получить доступ к частичной истории в моем шаблоне, он просто возвращает мне идентификатор.Поэтому я не могу получить заголовок, автора и содержимое этого идентификатора, поскольку это просто целое число, а не объект.

hot_feed = Upvote.objects.values('story').annotate(upvote_count=Count('story')).order_by('-upvote_count')

Может кто-нибудь помочь мне с поиском запроса?ищете?

1 Ответ

0 голосов
/ 16 декабря 2018

Вы запрашиваете не ту модель, вы здесь в основном выбираете Upvote s, упорядоченные по количеству историй, или что-то подобное.

Но ваш пробаби хочет получить Story s по количествуupvotes, поэтому вам нужно использовать Story в качестве «корня набора запросов» и аннотировать его числом upvotes:

<b>Story</b>.objects.annotate(
    upvote_count=Count(<b>'upvoted_story'</b>)
).order_by('-upvote_count')

Я думаю, что related_name вашего story, однако, немного " 1012 * вводит в заблуждение *».related_name - это имя отношения "в обратном порядке", поэтому, вероятно, лучше назвать upvotes:

class Upvote(models.Model):
    profile = models.ForeignKey(
        'accounts.Profile',
        on_delete=models.CASCADE,
        related_name=<b>'upvotes'</b>
    )
    story = models.ForeignKey(
        'Story',
        on_delete=models.CASCADE,
        related_name=<b>'upvotes'</b>
    )
    upvote_time = models.DateTimeField(auto_now=True)

В этом случае запрос будет:

Story.objects.annotate(
    upvote_count=Count(<b>'upvotes'</b>)
).order_by('-upvote_count')
...