我试图通过QuerySet显示几个相关的模型的数据。我的最终目标是根据站点模型中sw_delivery_date的日期范围过滤器,显示站点模型中的一些信息以及Ppack模型中的一些信息。
以下是我的模特:
class Site(models.Model):
mnemonic = models.CharField(max_length = 5)
site_name = models.CharField(max_length = 100)
assigned_tech = models.ForeignKey('Person', on_delete=models.CASCADE, null = True, blank = True)
hw_handoff_date = models.DateField(null = True, blank = True)
sw_delivery_date = models.DateField(null = True, blank = True)
go_live_date = models.DateField(null = True, blank = True)
web_url = models.CharField(max_length = 100, null = True, blank = True)
idp_url = models.CharField(max_length = 100, null = True, blank = True)
def __str__(self):
return '(' + self.mnemonic + ') ' + self.site_name
class Ring(models.Model):
ring = models.IntegerField()
def __str__(self):
return "6." + str(self.ring)
class Ppack(models.Model):
ppack = models.IntegerField()
ring = models.ForeignKey('Ring', on_delete=models.CASCADE)
def __str__(self):
return str(self.ring) + " pp" + str(self.ppack)
class Code_Release(models.Model):
Inhouse = 'I'
Test = 'T'
Live = 'L'
Ring_Location_Choices = (
(Inhouse, 'Inhouse'),
(Test, 'Test'),
(Live, 'Live'),
)
site_id = models.ForeignKey('Site', on_delete=models.CASCADE)
type = models.CharField(max_length = 1, choices = Ring_Location_Choices, blank = True, null = True)
release = models.ForeignKey('Ppack', on_delete=models.CASCADE)
def __str__(self):
return "site:" + str(self.site_id) + ", " + self.type + " = " + str(self.release)
如果我使用以下内容,
today = datetime.date.today()
future = datetime.timedelta(days=60)
new_deliveries = Site.objects.select_related().filter(sw_delivery_date__range=[today, (today + future)])
我可以获得Site模型中符合我标准的所有对象,但是,因为Site与Code_Release之间没有任何关系(其他方式是一对多),我可以&# 39;获取Code_Release数据。
如果我运行for循环,我可以遍历从上面查询返回的每个Site,并从Code_Release模型中选择数据,这样我就可以从Ppack和Ring模型中获取相关数据。
site_itl = {}
itl = {}
for delivery in new_deliveries:
releases = Code_Release.objects.select_related().filter(site_id = delivery.id)
for rel in releases:
itl[rel.id] = rel.release
site_itl[delivery.id] = itl
但是,这对我来说似乎过于复杂,多次数据库命中,并且可能很难解析模板中的数据库。
基于此,我认为我需要从Code_Release模型中进行选择。这与Site模型和Ppack模型(与Ring模型有关)有关。我以这种方式努力做出正确的查询/访问数据,以实现我想要的目标,但我觉得这是正确的方法。
我最好如何做到这一点?
答案 0 :(得分:0)
您可以在此处使用RelatedManager。当您声明ForeignKey时,Django允许您访问反向关系。具体来说,我们假设您有多个指向一个特定站点的代码版本。您可以使用<your_model_name_lowercase>_set
属性通过站点对象访问它们。所以在你的情况下:
site.code_release_set.all()
将返回具有ForeignKey的所有代码释放对象的QuerySet到对象site
答案 1 :(得分:0)
您可以从Site对象访问Releases。首先,您可以将related_name设置为具有模型之间反向关系的友好名称:
site_id = models.ForeignKey('Site', on_delete=models.CASCADE, related_name="releases")
然后,从Site对象中,您可以对Release model进行常规查询:
site.releases.all()
site.releases.filter(...)
...