我有以下模型,其中定义了货运公司及其保险公司。 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”
答案 0 :(得分:1)
鉴于您希望Truckers
与 no 相关的CaliIns_FK
对象,可以.filter()
Trucks
:
Truckers.objects.filter(caliins_fk__isnull=True)
或者给定ForeignKey
有一个related_name
,它应该是:
Truckers.objects.filter(myrelatedname__isnull=True)
(使用myrelatedname
中related_name
中ForeignKey
的值)
因此,我们在这里获得一个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)