Python 我可以使用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

我可以使用django中的订购方法吗

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异常不受破坏地“掉到”中。