Django查询链接模板中的相关数据

时间:2013-02-08 23:36:40

标签: django templates join models

我在Django应用程序中有两个数据表,一个包含运输船只的详细信息,另一个包含与各个船只相关的优惠。我的模型如下:

class Vessel(models.Model):
    name = models.CharField(max_length=64)
    image = models.CharField(max_length=64)
    vesseltype = models.ForeignKey(VesselType)
    capacity = models.IntegerField()
    length = models.FloatField()
    beam = models.FloatField()
    speed = models.IntegerField()
    activities = models.CharField(max_length=256)
    category = models.IntegerField()
    display_order = models.IntegerField()
    published = models.BooleanField()
    def __unicode__(self):
        return self.name

class Offer(models.Model):
    vessel = models.ForeignKey(Vessel)
    description = models.CharField(max_length=128)
    date = models.DateField()
    duration = models.IntegerField()
    itinerary = models.TextField()
    price = models.IntegerField()
    display_order = models.IntegerField()
    link = models.URLField()
    published = models.BooleanField()
    def __unicode__(self):
        return self.description

在我的views.py中,我有以下代码:

def home(request):
    vessels = Vessel.objects.filter(published='y').order_by('display_order')
    offers = Offer.objects.filter(vessel__published__exact='y').filter(published='y').order_by('display_order')
    t = loader.get_template('index.html')
    c = Context({
        'vessels' : vessels,
        'offers' : offers,
    })

在模板中,我需要显示多个div,每个div包含船只名称,船只的一些细节以及与该船只相关的任何数量的报价。

我查看了试图将每个船只中的优惠链接起来的查询,并且我还尝试在模板中的循环代码中识别船只名称,以便在vessel.id和offer.vessel匹配时显示优惠

到目前为止,没有任何成功的方法是只通过模板方式获取查询方面的错误以及单独的船名和提供列表。我如何加入这些信息,以便我可以在模板中使用这样的东西:

for offer in offers:
    offer.vessel.name
    offer.vessel.category
    offer.description
    offer.price

还是我期待太多?已经在这几个小时,并没有在文档中找到解决方案,但它可能是显而易见的。更改查询,视图代码或模板不是问题。

1 个答案:

答案 0 :(得分:0)

答案是更改您的view代码。您需要一个像Offer.objects.all().select_related()这样的查询集。 select_related将确保每次循环执行时都不会访问数据库,因为在执行查询之前它会跟随外键到达结尾。

您还使用了错误的template syntax。它需要像:

{% for object in object_list %}
{{ object.attribute }}
{% endfor %}