Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 - Fatal编程技术网

Python 获取相关模型日期字段的最小值(django)

Python 获取相关模型日期字段的最小值(django),python,django,Python,Django,我有以下两门课: class Incident(models.Model): iid = models.IntegerField(primary_key=True) person = models.ForeignKey('Person', on_delete=models.SET_NULL, null=True) class Source(models.Model): sid = models.IntegerField(primary_key=True) i

我有以下两门课:

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


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.DateField(null=True, blank=True)

我想在事件中创建一个字段,用于提取相关源的最小报告日期。这最好在模型中完成,还是在模板中完成?不确定最佳实践是什么,或者在这种情况下如何执行。

您可以使用模型的属性:

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

    @property
    def first_datereported(self):
        first_source = self.source_set.order_by('datereported').first()
        if first_source:
            return first_source.datereported
在模板或代码的任何其他部分中,您可以使用first_datereported作为普通模型的字段:

{{ incident_instance.first_datereported }}
这最好在模型中完成,还是在模板中完成

严格来说,模板不应该包含业务逻辑。它应该包含渲染逻辑。因此,它应该指定什么东西应该是可见的,而不是什么东西应该是可见的。所以它并不真正属于模板层,只属于模型层

您可以通过以下方式获得报告的最小日期:


如果需要整个对象,可以使用self.source\u set.order\u by'datereported'。首先,它将为您提供最早的相关源实例。但这对性能的影响很小,需要更长的时间。在这种情况下,Django将首先将所有列提取到内存中。如果您只需要一列,这将导致您在数据库端执行了一些无用的序列化,在Python端执行了反序列化。

您是指datereported本身还是相应的源对象?datereported本身!但是我对返回源对象也很好奇。这是同一个过程吗?我想你需要在last_Source中添加“无”的检查。这不会返回第一个报告的日期吗?在这种情况下,first_datereported可能是更好的名称或最早的报告日期。
from django.db.models import Min

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']
{{ some_incident.first_reporteddate }}