mercredi 8 février 2017

How do I display Django data from a related model of a related model?

Vote count: 0

I am trying to display data from several models that are related together through a QuerySet. My ultimate goal is to display some information from the Site model, and some information from the Ppack model, based on a date range filter of the sw_delivery_date in the Site model.

Here are my models:

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)

If I use the following,

today = datetime.date.today()
future = datetime.timedelta(days=60)
new_deliveries = Site.objects.select_related().filter(sw_delivery_date__range=[today, (today + future)])

I can get all of the objects in the Site model that meet my criteria, however, because there is no relation from Site to Code_Release (there's a one-to-many coming the other way), I can't get at the Code_Release data.

If I run a for loop, I can iterate through every Site returned from the above query, and select the data from the Code_Release model, which allows me to get the related data from the Ppack and Ring models.

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

But, that seems overly complex to me, with multiple database hits and possibly a difficult time parsing through that in the template.

Based on that, I was thinking that I needed to select from the Code_Release model. That relates back to both the Site model and the Ppack model (which relates to the Ring model). I've struggled to make the right query / access the data in this way that accomplishes what I want, but I feel this is the right way to go.

How would I best accomplish this?

asked 4 secs ago

Let's block ads! (Why?)



How do I display Django data from a related model of a related model?

Aucun commentaire:

Enregistrer un commentaire