我有两个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
,请保留ThingDateOverride
或Thing
} / Category
对。
按生成的时间戳设置Thing
。
我可以在SQL中解决这个问题,但我宁愿避免编写特定于引擎的代码。我目前正在实现围绕ORM的逻辑(在纯python中),但我希望数据库能够处理这个。
我该怎么做?
答案 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
如果不是另一列,然后按该列排序。
注意:此代码仅适用于override
和date_created
字段具有不同名称,因此可以区分它们。否则MySQL将返回错误,例如“字段名称不明确”,并且需要添加表名。
答案 1 :(得分:0)
如果您需要Thing
,则应该从该模型开始并使用reverse relationship:
Thing.objects.filter(thingdateoverride__category=category).order_by("thingdateoverride__override", "date_created")