如何显示相关模型的相关模型中的Django数据?

2024-04-19 23:00:57 发布

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

我试图显示通过查询集关联在一起的几个模型的数据。我的最终目标是基于站点模型中sw\u delivery\u日期的日期范围过滤器,显示站点模型中的一些信息,以及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)])

我可以得到站点模型中所有符合我的条件的对象,但是,因为站点和代码发布之间没有关系(一对多的关系正好相反),所以我不能得到代码发布数据。你知道吗

如果我运行for循环,我可以遍历从上述查询返回的每个站点,并从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

但是,对我来说,这似乎过于复杂,因为有多个数据库点击,并且可能很难在模板中解析。你知道吗

基于这一点,我认为我需要从代码发布模型中进行选择。这与Site模型和Ppack模型(与环模型相关)有关。我一直在努力以这种方式进行正确的查询/访问数据,以实现我想要的,但我觉得这是正确的方式。你知道吗

我怎样才能最好地完成这个任务?你知道吗


Tags: 数据模型selfidtrue站点modelssite
2条回答

可以从站点对象访问版本。首先,您可以输入一个相关的\u名称,以获得模型之间反向关系的友好名称:

site_id = models.ForeignKey('Site', on_delete=models.CASCADE, related_name="releases")

然后,从站点对象可以进行常规查询以发布模型:

site.releases.all()
site.releases.filter(...)
...

您可以在这里使用RelatedManager。当您声明ForeignKey时,Django允许您访问反向关系。具体来说,假设您有多个代码版本指向一个特定站点。您可以使用<your_model_name_lowercase>_set属性通过site对象访问它们。所以在你的情况下:

site.code_release_set.all()

将返回所有具有ForeignKey to objectsite的代码发布对象的QuerySet

相关问题 更多 >