基于 ForeignKey 模型字段的 Django 过滤器
Django filter based on ForeignKey model field
我正在尝试删除冗余的条码模型字段。 mostrecentscantime
条码不需要,因为我可以参考mostrecentscan.time
。
class Scan(models.Model):
time=DateTimeField(default=timezone.now)
barcode=ForeignKey('Barcode',on_delete=models.CASCADE,related_name='scans')
location=ForeignKey(Location,on_delete=models.CASCADE)
class Barcode(models.Model):
barcode = CharField(max_length=50,unique=True)
time_created = DateTimeField(default=timezone.now)
mostrecentscan=ForeignKey(Scan,on_delete=models.CASCADE,related_name='+',null=True)
mostrecentscantime=DateTimeField()
消除 mostrecentscantime
的问题出现在这个查询中,我试图确定 time_created
和 mostrecentscan
的 time
更大的所有条码对象超过 7 天。
工作查询:
barcodematches = Barcode.objects.annotate(
diff=ExpressionWrapper(F('mostrecentscantime') - F('time_created'), output_field=DurationField())
).filter(diff__gte=timedelta(days=7))
在这种情况下我不能简单地引用 mostrecentscan.time
。我也试过向条形码添加一个 @属性 字段,但它也不起作用。
F
表达式可以遵循这种情况下的关系,所以这应该有效:
F('mostrecentscan__time') - F('time_created')
我正在尝试删除冗余的条码模型字段。 mostrecentscantime
条码不需要,因为我可以参考mostrecentscan.time
。
class Scan(models.Model):
time=DateTimeField(default=timezone.now)
barcode=ForeignKey('Barcode',on_delete=models.CASCADE,related_name='scans')
location=ForeignKey(Location,on_delete=models.CASCADE)
class Barcode(models.Model):
barcode = CharField(max_length=50,unique=True)
time_created = DateTimeField(default=timezone.now)
mostrecentscan=ForeignKey(Scan,on_delete=models.CASCADE,related_name='+',null=True)
mostrecentscantime=DateTimeField()
消除 mostrecentscantime
的问题出现在这个查询中,我试图确定 time_created
和 mostrecentscan
的 time
更大的所有条码对象超过 7 天。
工作查询:
barcodematches = Barcode.objects.annotate(
diff=ExpressionWrapper(F('mostrecentscantime') - F('time_created'), output_field=DurationField())
).filter(diff__gte=timedelta(days=7))
在这种情况下我不能简单地引用 mostrecentscan.time
。我也试过向条形码添加一个 @属性 字段,但它也不起作用。
F
表达式可以遵循这种情况下的关系,所以这应该有效:
F('mostrecentscan__time') - F('time_created')