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()]
是的,如果您认为这样可以使代码更清晰,可以这样做。您已经提到创建了很多管理器方法—并非每个查询都需要是管理器方法,过度使用它们会使代码更难阅读,因为读者将不断地向管理器查询查询的内容