Python Django定制订单
我有一辆带外键的车型,比如车主,可能是空的,也可能不是空的。 这辆车有生产日期 我想按日期订购这些汽车,但如果汽车有车主,则必须采用车主的出生日期,而不是汽车的创建日期Python Django定制订单,python,django,sql-order-by,Python,Django,Sql Order By,我有一辆带外键的车型,比如车主,可能是空的,也可能不是空的。 这辆车有生产日期 我想按日期订购这些汽车,但如果汽车有车主,则必须采用车主的出生日期,而不是汽车的创建日期 这可能吗?您可以编写一个方法,返回适当的日期(如果汽车有车主返回生日或返回创建日期),然后看看这个类似的问题: 您不能使用模型的元排序,因为它只接受一个字段 您不能使用查询order\u by('creation\u date','birthdate'),因为只有当它们具有相同的creation\u date时,它才会按出生日
这可能吗?您可以编写一个方法,返回适当的日期(如果汽车有车主返回生日或返回创建日期),然后看看这个类似的问题: 您不能使用模型的元
排序
,因为它只接受一个字段
您不能使用查询order\u by('creation\u date','birthdate')
,因为只有当它们具有相同的creation\u date时,它才会按出生日期进行排序
因此,您可以编写一个自定义管理器来为您合并自定义排序
import operator
class CarManager(models.Manager):
def get_query_set(self):
auths = super(CarManager, self).get_query_set().all().order_by('-creation')
ordered = sorted(auths, key=operator.attrgetter('birthday'))
return ordered
class Car(models.Model):
sorted = CarManager()
现在您可以查询:
Car.sorted.all()
要获取已排序汽车的所有查询集,请返回SQL:
Car.objects.filter(...).extra(select={'odate': '''
if(owner_id,
(select date_of_birth from owner_table where id=owner_id),
creation_date
)
'''}).order_by('odate')
如果
函数是特定于MySQL的。对于SQLite或Postgres,您应该使用case
语句。这似乎是最简单的解决方案。但您给出的示例是sum的注释,一个聚合函数。我想用我自己的函数来注释它。我用了这个,它成功了!我在自定义管理器中定义了一个函数,其中我使用list()将查询集转换为列表,然后使用car.date作为键进行插入排序。get_date是我的汽车模型中的一个方法,它返回车主的出生日期或汽车的创建日期。我后来将car.date定义为属性(get_date)。谢谢别忘了与list()
:list()保持良好关系。通过对查询集调用list()强制对其求值。不过,请注意,这可能会有很大的内存开销,因为Django会将列表中的每个元素加载到内存中。相反,在QuerySet上迭代将利用您的数据库加载数据并仅在需要时实例化对象。
Django的设计与数据库无关,因此我更喜欢Timmy的解决方案。无论如何谢谢你!