Python 我可以使用django中的订购方法吗?
我可以使用django中的订购方法吗Python 我可以使用django中的订购方法吗?,python,django,Python,Django,我可以使用django中的订购方法吗 class Question(models.Model): writer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name='questions', on_delete=models.SET_NULL) contents = mod
class Question(models.Model):
writer = models.ForeignKey(settings.AUTH_USER_MODEL, null=True,
related_name='questions',
on_delete=models.SET_NULL)
contents = models.TextField()
def date_of_receive(self):
try:
return self.answers.first().creation.date()
except AttributeError:
return None
except:
assert False, 'error'
class Answer(models.Model):
writer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='answers')
contents = models.TextField()
question = models.ForeignKey(Question, related_name='answers', null=True,
on_delete=models.SET_NULL)
我想问一下“收到日期”之前的订单
我该怎么办?您应该用python本身对结果进行排序。由于接收日期是一种方法,因此无法在数据库级别对其进行排序。您可以通过两种方式进行排序:使用
order\u by
,它依赖于数据库为您排序,或者将所有结果提取到应用程序进程的内存中并排序。数据库对Python或您的方法一无所知,因此只有在内存中排序时才能根据方法的结果排序
但是,在这种情况下,您的方法可以简化为数据库调用.order_by('answers__creation')
可能会提供您想要的,但否则您可以使用聚合和注释仅获取第一个创建日期时间。我想它看起来像这样:
from django.db.models import Min
Question.objects.annotate(date_of_receive=Min('answers__creation')).order_by('date_of_receive')
注意,在一个非常大的数据集上,没有办法有效地做到这一点。如果有数十万行,则根本不应该在应用程序内存中排序,而在数据库内存中排序将花费很长时间。此时,您需要对数据进行非规范化。然而,只有当你真的认为你的数据集会变得那么大的时候,才可以这样做,因为非规范化数据是引入细微错误的好方法。你不能。Django的
order_by()
在数据库级别上工作
尽管您可以通过执行以下操作来实现订购
sorted(Question.objects.all(), key=lambda k: k.date_of_receive())
仅供参考,光秃秃的“except”(try/except/except的最后一个子句)除了打乱您的回溯之外,什么都做不了。我建议你放弃它。本质上,没有理由使用except
子句而不命名特定的异常——在这种情况下,您的AttributeError异常执行您想要的操作,并且应该允许非AttributeError异常不受破坏地“掉到”中。