所以我有三个模型,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
但我如何指定我要按特定的用户\u ids uservotes排序?我还可以检索与某个用户对应的所有uservots并对其进行排序,但是如何将所有这些转换为post呢?
编辑:经过一番挖掘,我找到了 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]
这是有表现的,但我觉得应该有一个内在的方式来做我想做的事?我
我太笨了,我忘了我可以 .order_by(-time)
既然我已经准备好了过滤器,哎呀
1条答案
按热度按时间ikfrs5lh1#
创建投票的时间是用于排序投票的最佳属性。在模型定义中使用排序权限: