mysql - Django 搜索查询与 Annotate 比较投票和帖子年龄

标签 mysql django search filter annotate

我尝试进行 django 查询以按 VOTES - POST AGE 获取帖子顺序。

示例:

普通帖子

1 - Hello World (10 votes) (Posted today)
2 - Stackoverflow ( 12 votes) (Posted 2 days ago)
3 - StackExchange ( 30 votes ) (Posted 19 days ago)

所以当我通过注释过滤查询时,我想要这个:

1 - StackExchange ( 30 votes - 19 days ago = 11 points)
2 - Hello World ( 10 votes - 0 days ago = 10 points)
3 - Stackoverflow ( 12 votes - 2 days ago = 10 points)

我尝试:

class DiffDays(Func):
    function = 'DATEDIFF'
    template = "%(function)s(%(expressions)s)"


class CastDate(Func):
    function = 'DATE_FORMAT'
    template = "%(function)s(%(expressions)s, '%%%%Y-%%%%m-%%%%d')"


list_posts = posts.extra(
    select={'pub_date': "DATE_FORMAT(pub_date,'%%%%Y-%%%%m-%%%%d')"}
).annotate(
    diff_days=DiffDays(
        CastDate(today), F('pub_date')), output_field = DecimalField()
).annotate(
    days_votes=ExpressionWrapper(
        F('n_votes') - F('diff_days'), output_field=IntegerField())
).order_by('days_votes')

但我得到:'IntegerField'对象没有属性'resolve_expression'

最佳答案

现在 diff_days 注释中的 output_field 是注释的参数,但它必须是 DiffDays 的参数,所以你需要添加括号将其放入 func DiffDays

today = today.strftime('%Y-%m-%d')

annotate(
    diff_days=DiffDays(
        (today, F('pub_date')), output_field=DecimalField())
      #^^^                                                ^^^
)

关于mysql - Django 搜索查询与 Annotate 比较投票和帖子年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46206540/

相关文章:

php - 现有电子商务解决方案 VS 定制构建

mysql:从表中选择 * 时更改日期时间格式

python - 关于Django教程官方part3 html代码的问题

python - Django Rest 返回 0 字节 zip 文件作为响应

PHP 搜索数组速度

firebase - 如何通过flutter搜索我的firestore数据库中的多个字段

MySQL - 条件查询,语句结果

mysql - 根据连接表计算 SQL 分数

javascript - 尝试将 id 从 django 模板传递给 reactjs 时出现错误或空值

sql - 返回统计信息而不是点击的关键字搜索引擎