首页 > 解决方案 > 反向查找“QuerySet”对象没有属性

问题描述

我有以下模型,我在其中定义了一家货运公司及其保险公司。模型.py:

class Truckers(models.Model):
    DOT_Number = models.IntegerField(primary_key=True)
    Address = models.CharField( max_length=200)  

class CaliIns_FK(models.Model):
    DOTNmb = models.ForeignKey(Truckers, on_delete=models.CASCADE) 
    CoName = models.CharField(max_length=20)

有很多卡车司机,但没有那么多保险公司。我正在尝试获取每个有保险的卡车司机的名单。

我按照django尝试了以下操作:

truck = Truckers.objects.all()
filtered = truck.caliinsfk_set.filter(truckers__isnull=True)

filtered = truck.caliins_fk_set.filter(truckers__isnull=True)

收到错误:

AttributeError:“QuerySet”对象没有属性“caliinsfk_set”

标签: pythondjango

解决方案


鉴于您想要没有相关的Truckers对象,您可以:CaliIns_FK.filter()Trucks

Truckers.objects.filter(caliins_fk__isnull=True)

或鉴于ForeignKeyhas a related_name,它应该是:

Truckers.objects.filter(myrelatedname__isnull=True)

(其中的myrelatedname值) 在这里,我们因此获得没有相关对象的a 。related_nameForeignKeyQuerySetCaliIns_FK

这会产生一个带有 a 的查询,LEFT OUTER JOIN因此如果相关 s 的“集合”CaliIns_FK为空,它将有一行带有NULL

SELECT truckers.*
FROM truckers
LEFT OUTER JOIN caliins_fk ON truckers.DOT_Number = caliins_fk.DOTNmb_id
WHERE caliins_fk.id IS NULL

请注意,模型通常不使用复数名称,或外键中的主键名称。根据 PEP-8,属性也用小写字母和下划线书写。一个更 Django-ish 的方法是:

class Trucker(models.Model):
    dot_number = models.IntegerField(primary_key=True)
    address = models.CharField( max_length=200)

CaliInsurance(models.Model):
    trucker = models.ForeignKey(Trucker, on_delete=models.CASCADE)
    coname = models.CharField(max_length=20)

在这种情况下,查询看起来像:

Trucker.objects.filter(caliinsurance__isnull=True)

推荐阅读