Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Django 获得「;“一”;在自定义管理器中没有重复记录的OneToMany关系的一方_Django - Fatal编程技术网

Django 获得「;“一”;在自定义管理器中没有重复记录的OneToMany关系的一方

Django 获得「;“一”;在自定义管理器中没有重复记录的OneToMany关系的一方,django,Django,我试图检索OnetoMany关系的one端,但此操作受many端必须满足的一些条件的制约: 例子 #一边 等级车(型号.型号): #多方 类别义务(models.Model): 汽车=车型.外键(to=汽车,on_delete=车型.级联) 过期日期=models.DateField(默认值=date.today) 我要寻找的是获得所有有义务且其到期日已过期的汽车,因为我已经创建了一个管理器来执行此操作: from datetime导入日期 今天=日期。今天() 类CarManager(mod

我试图检索
OnetoMany
关系的
one
端,但此操作受
many
端必须满足的一些条件的制约:

例子
#一边
等级车(型号.型号):
#多方
类别义务(models.Model):
汽车=车型.外键(to=汽车,on_delete=车型.级联)
过期日期=models.DateField(默认值=date.today)
我要寻找的是获得所有
义务
且其
到期日
已过期的
汽车
,因为我已经创建了一个
管理器
来执行此操作:

from datetime导入日期
今天=日期。今天()
类CarManager(models.Manager):
“”“为车型定义管理器。”“”
已过期(自我)->“查询设置[汽车]”的def:
“购买那些到期的汽车。”
返回self.get_queryset().filter(
债务到期日=今天
)
问题 如果在运行
Car.objects.时,一辆
Car
有2或3个
responsibility
。如果义务过期()
,您将获得:

结果是一个查询集列表,其中包含重复的汽车记录,因为许多义务属于一辆汽车,然后每个义务返回所属的汽车。但我需要一份没有重复记录的清单

我的意思是,我需要得到一份没有重复记录的过期义务汽车的列表。

您可以使用返回同一对象一次:

from datetime import date

class CarManager(models.Manager):
    """Define a manager for Car model."""

    def with_obligations_expired(self) -> "QuerySet[Car]":
        """Get those cars whose obligations are expired."""
        return self.get_queryset().filter(
            obligation__expiration_date__lte=date.today()
        ).distinct()
from datetime导入日期
类CarManager(models.Manager):
“”“为车型定义管理器。”“”
已过期(自我)->“查询设置[汽车]”的def:
“购买那些到期的汽车。”
返回self.get_queryset().filter(
义务\到期\日期\ lte=日期。今天()
).distinct()
因此,如果至少有一个
义务
过期,此查询集将返回一个
汽车


您可能希望使用或进行筛选,使过期日期早于今天。

您可以向查询中添加
distinct()
,以获得distinct/uniqueresults@OP:删除
TODAY
变量并将
date.TODAY()
添加到查询中非常重要。如果你的应用程序运行超过一天,那么
TODAY
变量将是昨天的日期,并且将是incorrect@IainShelvington如果我想得到那些义务即将到期的汽车,那么我想提前一天得到这些捐赠,比如
responsibility\uuuuuu expiration\uuuu date\uuuuuuuu range=[昨天,今天]
其中
今天=日期。今天()
昨天=今天-时间增量(天=1)
在这种情况下,我昨天得到两次?@CristianCamiloFlórez当调用方法时,您需要计算
今天
昨天
,因为这些值不是静态的,如果您的程序运行时间足够长,您可以创建一个名为
昨天
的实用函数,如果您想减少代码量你写<代码>定义昨天():返回日期.today()-timedelta(days=1)
然后调用此函数代替以前计算它的位置
range=[beday(),date.today()]
是的,如果您认为这样可以使代码更清晰,可以这样做。您已经提到创建了很多管理器方法—并非每个查询都需要是管理器方法,过度使用它们会使代码更难阅读,因为读者将不断地向管理器查询查询的内容