反向查询'QuerySet'对象没有属性

时间:2018-11-25 18:04:28

标签: python django

我有以下模型,其中定义了货运公司及其保险公司。 Models.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”

1 个答案:

答案 0 :(得分:1)

鉴于您希望Truckers no 相关的CaliIns_FK对象,可以.filter() Trucks

Truckers.objects.filter(caliins_fk__isnull=True)

或者给定ForeignKey有一个related_name,它应该是:

Truckers.objects.filter(myrelatedname__isnull=True)

(使用myrelatednamerelated_nameForeignKey的值) 因此,我们在这里获得一个QuerySet,没有与之相关的CaliIns_FK对象。

这将导致查询中包含LEFT OUTER JOIN,因此,如果相关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

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

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)