gpt4 book ai didi

python - 如何通过 django 属性订购,或替代解决方案

转载 作者:行者123 更新时间:2023-12-01 09:17:17 25 4
gpt4 key购买 nike

好吧,我是 django 新手,不确定我是否正确地处理了这个问题,但这里是:

我有一类事件和事件源,其中单个事件可以有多个源。

class Incident(models.Model):
iid = models.IntegerField(primary_key=True)
person = models.ForeignKey('Person', on_delete=models.SET_NULL, null=True)

@property
def first_reporteddate(self):
return self.source_set.aggregate(first=Min('datereported'))['first']


class Source(models.Model):

sid = models.IntegerField(primary_key=True)
incident = models.ForeignKey('Incident', on_delete=models.SET_NULL, null=True)
url = models.TextField(validators=[URLValidator()])
datereported= models.DateTimeField(null=True, blank=True)

创建新事件时,我想要求也创建源。我想让用户可以选择按 ID、人员或报告的最早事件源日期对事件模型进行排序。

是否可以让模型按属性排序(在本例中为first_reporteddate),或者它是否需要是一个字段?我应该如何构建这个流程?

最佳答案

Is it possible to have a model sorted by a property (in this case first_reporteddate), or does it need to be a field? How should I go about structuring this process?

您无法在数据库级别对属性进行排序。您可以在 Python 中执行此操作,但这通常不会非常有效。

但是,您可以做的是构造一个注释。例如:

from django.db.models import Min

Incident.objects<b>.annotate(
first_reporteddate = Min('source__datereported')
)</b>.order_by(
<b>'first_reporteddate'</b>
)

所以在这里我们让数据库注释每个事件(以及那些没有被过滤掉的情况,以防我们.filter(..)),然后我们通过这个注释进行排序。

如果属性的逻辑太复杂而无法在数据库级别处理(如果逻辑非常复杂,或者需要 Web 服务、文件系统,这可能很困难,甚至不可能)。您可以使用 Python 本身进行排序。但是(a)这通常效率低下,并且(b)结果是一个列表,因此不再是您可以进一步过滤的查询集。例如:

<b>sorted(</b>Incident.objects.all()<b>, key=lambda x: x.first_reporteddate)</b>

这里的结果是一个包含所有事件实例的列表,如果您对第一个、前三个等感兴趣,那么通常效率很低。项目。此外,如果 first_reporteddate 返回 None,这将引发错误,尽管您可以编写额外的逻辑来避免这种情况。

关于python - 如何通过 django 属性订购,或替代解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51127443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com