是否可以使用可调用的 order_by ?

发布于 2024-08-12 11:48:26 字数 907 浏览 2 评论 0原文

重复: 使用 Django 自定义模型order_by() 中的方法属性

我有两个模型;一个存储帖子,另一个存储对这些帖子进行的投票,使用外键字段进行关联。每个投票都存储为单独的记录,因为我需要跟踪投票的用户和日期时间。

我创建了一个辅助函数,它使用 Django 1.1 聚合 Sum 函数来统计所有投票。

class Post(models.Model):
    ...some fields...

    def tally(self):
        return self.vote_set.all().aggregate(Sum('value'))['value__sum'] or 0

class Vote(models.Model):
    post = models.ForeignKey(Post)
    value = models.IntegerField()
    ...some fields...

我需要进行的一个查询需要对计数进行一次性 order_by 操作。但是:

Post.objects.all().order_by('tally')

会产生以下模板错误:

渲染时捕获异常: 无法将关键字“tally”解析为 场地。选项有:创建日期、 描述、id、is_active、名称、 相关、slug、用户、投票

有什么方法可以让 order_by() 函数接受可调用吗?

DUPLICATE: Using a Django custom model method property in order_by()

I have two models; one that stores posts and another that stores votes made on those posts, related using a ForeignKey field. Each vote is stored as a separate record since I need to track the user and datetime that the vote was cast.

I've created a helper function that tallys all the votes using the Django 1.1 aggregation Sum function.

class Post(models.Model):
    ...some fields...

    def tally(self):
        return self.vote_set.all().aggregate(Sum('value'))['value__sum'] or 0

class Vote(models.Model):
    post = models.ForeignKey(Post)
    value = models.IntegerField()
    ...some fields...

One query I need to make needs to do a one off order_by of the tally. However:

Post.objects.all().order_by('tally')

yields the following template error:

Caught an exception while rendering:
Cannot resolve keyword 'tally' into
field. Choices are: date_created,
description, id, is_active, name,
related, slug, user, vote

It there any way to get the order_by() function to take a callable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

童话 2024-08-19 11:48:26

事实证明 Annotate 方法是解决方案:

Post.objects.all().annotate(vote_tally=Sum('vote__value')).order_by('-vote_tally')

It turns out the Annotate method was the solution:

Post.objects.all().annotate(vote_tally=Sum('vote__value')).order_by('-vote_tally')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文