Django查询集的多对多和一对多

2024-04-26 05:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个型号.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)

我只知道Equipmentserialno,我不知道正确的查询集? 到目前为止,我知道如何查询外键。你知道吗

sn       = 'abc'

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

Tags: tokeyidtruemodelobjectsmodelsbe
1条回答
网友
1楼 · 发布于 2024-04-26 05:41:09

你知道设备序列号,所以用-

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

由于RSL类的equipment字段和Equipment类是多个关系,因此可能有多个RSL类对象与一个设备对象相关。要获取查询集,请使用-

rsl_queryset = equip.rsl_set.all()

(请通过检查dir(equip)中是否列出rsl_set来检查rsl_set是否是装备对象的方法。看看你的模型,很可能是。顺便说一句,您可以通过在定义中添加相关的\u name=“name you want”将其更改为所需的名称。 例如:

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

这样您就可以通过rsl_queryset = equip.rsl_objects.all()访问它了

现在您有了一个包含与equip对象相关的RSL对象的queryset。所以,迭代它们得到你想要的值-

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

相关问题 更多 >