Django queryset ManytoMany和OnetoMany

时间:2013-08-25 04:53:38

标签: python django django-queryset

我有这个models.py

class Sitename(models.Model): 
   #id              = models.AutoField(primary_key=True)  ## to be removed
    site            = models.CharField()                  ## find values

class Equipment(models.Model):
   #id              = models.AutoField(primary_key=True)  ## to be removed
    serialno        = models.CharField()                  ## known values

class RSL(models.Model): ##Radio Station License
   #id              = models.AutoField(primary_key=True)  ## to be removed
    sitename        = models.ForeignKey(Sitename)
    equipment       = models.ManyToManyField(Equipment)

我只知道Equipment serialno,我无法找出正确的查询集? 到目前为止,我知道如何查询外键。

sn       = 'abc'

equip    = Equipment.objects.get(serialno=sn)
rsl      = RSL.objects.?????
sitename = Site.objects.get(pk=rsl.pk)

1 个答案:

答案 0 :(得分:1)

您知道设备序列号,因此请使用 -

equip = Equipment.objects.get(serialno=sn)

因为RSL类和equipment类的Equipment字段是Many2Many关系,所以可能有多个RSL类对象与一个Equipment对象相关。要获取查询集,请使用 -

rsl_queryset = equip.rsl_set.all()

(请检查rsl_set是否是装备对象的方法,方法是检查它是否列在dir(equip)中。看看你的模型,很可能是.BTW,你可以把它改成名字你想通过添加related_name =“你想要的名字”到定义。 例如: -

equipment = models.ManyToManyField(Equipment, related_name = "rsl_objects")

这样您可以通过rsl_queryset = equip.rsl_objects.all()

访问它

现在您有一个包含与装备对象相关的RSL对象的查询集。因此,迭代它们以获得您想要的值 -

for rsl_object in rsl_queryset:
    print "site = " + rsl_object.sitename.site