【问题标题】:Django Search Query comparing votes and post age with AnnotateDjango Search Query 使用 Annotate 比较投票和帖子年龄
【发布时间】:2018-02-22 16:42:42
【问题描述】:

我试图通过 VOTES - POST AGE 进行 django 查询以获取帖子顺序。

示例:

普通帖

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' object has no attribute 'resolve_expression'

【问题讨论】:

    标签: mysql django search filter annotate


    【解决方案1】:

    现在output_field in annotate for diff_days 是annotate 的一个参数,但它必须是DiffDays 的一个参数,所以你需要添加括号将其放入func DiffDays

    today = today.strftime('%Y-%m-%d')
    
    annotate(
        diff_days=DiffDays(
            (today, F('pub_date')), output_field=DecimalField())
          #^^^                                                ^^^
    )
    

    【讨论】:

    • 我知道了:sequence item 0: expected str instance, bytes found
    • 你是怎么得到today的?
    • today = datetime.date.today()
    • 你可以试试更新版本,我不使用mysql,你确定日期格式'%%%%Y-%%%%m-%%%%d'吗? docs 看起来像 '%Y-%m-%d'
    • 不会工作。 '%%%%Y-%%%%m-%%%%d' 等于 '%Y-%m-%d'。但如果我只使用'%Y-%m-%d',Python 认为我使用的是%s 之类的字符串格式。
    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多