Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django定制订单_Python_Django_Sql Order By - Fatal编程技术网

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的解决方案。无论如何谢谢你!