2

我有两个 Django 模型,大致概括如下:

class Thing(Model):
    date_created = DateTimeField()

class ThingDateOverride(Model):
    thing    = ForeignKey(Thing)
    category = ForeignKey(Category)
    override = DateTimeField()

我想要做的是Things为给定的 aCategory按适当的ThingDateOverride override字段排序的列表,如果不存在这样的覆盖,则为Thing's 。date_created

换句话说:

  • 对于Thing中的每个QuerySet,保留其中一个Thing.date_created或如果该/对存在override适当的。ThingDateOverrideThingCategory

  • Thing按生成的时间戳对集合进行排序。

我可以在 SQL 中实现这一点,但我宁愿避免编写可能特定于引擎的代码。我目前正在实现围绕 ORM 的逻辑(在纯 python 中),但我希望数据库来处理这个。

我该怎么做?

4

2 回答 2

1

可以吗,该类别存储在ThingDateOverride? 如果是,则Thing对象没有没有覆盖对象的类别。

我假设每个对象ThingDateOverride都存在Thing对象(因此将类别分配给每个Thing对象)。overridefield 可以为 NULL,然后date_createdobject 将用于对事物进行排序。override然后此代码应按是否存在或date_created不存在进行排序:

Thing.objects.filter(thingdateoverride__category=category).extra(select={'d': 'if(override, override, date_created)'}).order_by('d')

这个想法是使用extra并选择override字段,如果它存在,或者date_created如果不作为另一列,然后按该列排序。

注意:此代码之所以有效,只是因为overridedate_created字段具有不同的名称,因此可以区分它们。否则 MySQL 会返回错误,比如“字段名不明确”,需要添加表名。

于 2012-09-22T08:49:27.287 回答
0

如果需要Thing,您应该从该模型开始并使用 反向关系

Thing.objects.filter(thingdateoverride__category=category).order_by("thingdateoverride__override", "date_created")
于 2012-09-22T05:56:56.023 回答