【问题标题】:Django Model how to order by vote time?Django Model如何按投票时间排序?
【发布时间】:2020-11-18 15:53:01
【问题描述】:

所以我有三个模型,User、Post 和 UserVote:

用户是默认的 django.contrib.auth 用户

后定义:

class Post(models.Model):
    num_likes = models.IntegerField(default=0)
    num_dislikes = models.IntegerField(default=0)
 
    # when deleting users, we should simply set user.is_active to False,
    # that way this doesn't break
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    text = models.CharField(max_length=200, default="")

用户投票:

class Action(models.TextChoices):
    UP = 'u'
    DOWN = 'd'

class UserVotes(models.Model):
    voter = models.ForeignKey(User, on_delete=models.CASCADE)
    item = models.ForeignKey(Post, on_delete=models.CASCADE)
    type = models.CharField(max_length=2, choices=Action.choices, default=Action.UP)
    time = models.DateTimeField('time voted on', default=timezone.now)

    class Meta:
        unique_together = ('voter', 'item')

在用户的个人资料页面上,我想按用户投票时间的降序返回用户投票的帖子。我有点迷失在这里。我可以退回用户投票但不属于他们的帖子:

def get_users_liked_posts(user_id):
    Post.objects.filter(uservotes__voter__id=user_id, uservotes__type=Action.UP).exclude(user_id=user_id)

但我不确定要传递给 order_by 什么?类似于-uservotes__time,但我如何指定我想通过特定的 user_ids 用户投票来订购?我还可以检索与用户对应的所有用户投票并对其进行排序,但是我如何将所有这些都变成帖子?

编辑:经过一番挖掘,我找到了select_related 函数: https://www.kite.com/python/docs/django.db.models.QuerySet.select_related

这允许我这样做:

def get_users_liked_posts(user_id):
    # note: position of select_related in query is irrelevant
    upvotes = UserVotes.objects.filter(voter_id=user_id, type=Action.UP).exclude(item__user_id=user_id).order_by('-time').select_related('item')
    return [upvote.item for upvote in upvotes]

它是高性能的,但我觉得应该有一种内置的方式来做我想做的事情?我

EDIT2:我太笨了,我忘了我可以.order_by(-time),因为我已经有了过滤器,哎呀

【问题讨论】:

    标签: python sql django django-models


    【解决方案1】:

    创建投票的时间是用于排序投票的最佳属性。在模型定义中使用排序权,如下所示:

    class Meta:
        unique_together = ('voter', 'item')
        ordering = ['-time']
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2021-10-02
      • 1970-01-01
      • 2010-10-07
      相关资源
      最近更新 更多