【问题标题】:Django order by across foreign keysDjango 跨外键排序
【发布时间】:2014-01-24 20:28:30
【问题描述】:

我有一个模型可以连接到两个模型之一。我是这样设置的:

class Example(models.Model):
    foo_flag = models.BooleanField(default=False)
    foo = models.ForeignKey(Foo)
    bar_flag = models.BooleanField(default=False)
    bar = models.ForeignKey(Bar)

现在FooBar 都有一个名为date_created 的字段,其中包含日期时间。如果我有以下查询集:

queryset = Example.objects.all()

我怎样才能让它按date_created 排序,而不管外键用于哪个模型?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    queryset = Example.objects.order_by('foo__date_created','bar__date_created') 不工作吗?

    【讨论】:

    • 否,因为这将首先由foo__date_created 订购,然后在需要以相同优先级订购时由bar__date_created 订购
    • @RyanSaxe 你怎么可能在两个字段上排序而不优先考虑一个?
    • 但是,按照你说的,一个Example只会有一个Foo一个Bar。优先级相同。
    • @RobL 如果您对可为空的列进行排序,请记住您将有错误的排序。例如。未设置 foo 的记录将始终位于顶部(或底部取决于排序顺序),而不管 bar 的值(这是您真正关心的值)。
    • 嗯,它必须是这样的:queryset = Example.objects.extra(select={'o':'(case when foo__date_created IS NOT NULL then foo__date_created when bar__date_created IS NOT NULL then bar__date_created end)', order_by='o'}date_created 列可能必须包含直通表名称。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2016-05-29
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多