Django:加入,保留两列中的一列,然后按顺序排序

时间:2012-09-21 16:04:40

标签: sql django django-orm

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

class Thing(Model):
    date_created = DateTimeField()

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

我想要做的是为给定的Things生成一个Category列表,该列表按相应的ThingDateOverride override字段或Thing排序如果不存在这样的覆盖,则为date_created

换句话说:

  • 对于Thing中的每个QuerySet,如果Thing.date_created存在适当的override,请保留ThingDateOverrideThing } / Category对。

  • 按生成的时间戳设置Thing

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

我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

我假设每个ThingDateOverride对象都存在Thing对象(因此类别被分配给每个Thing对象)。 override字段可以为NULL,然后date_created对象将用于对事物进行排序。然后,如果代码存在,则此代码应按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将返回错误,例如“字段名称不明确”,并且需要添加表名。

答案 1 :(得分:0)

如果您需要Thing,则应该从该模型开始并使用reverse relationship

Thing.objects.filter(thingdateoverride__category=category).order_by("thingdateoverride__override", "date_created")