Django模型与模板中的多对一关系

时间:2014-04-07 19:03:41

标签: python django python-2.7 django-models django-templates

我有两个具有一对多关系的对象:

from django.db import models

class DownloadItem(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    downloadItem = models.ImageField(upload_to='./images/downloadItems', blank=True)

    def __unicode__(self):
        return self.name

class DownloadItemSample(models.Model):
    photo = models.ImageField(upload_to='./images/downloadItemsSample', blank=True)
    downloadItem = models.ForeignKey(DownloadItem, blank=True, null=True)
    order = models.IntegerField(default=0)

在我看来,我正在做以下事情:

from django.shortcuts import render
from mainstore.models import DownloadItem

def index(request):
    downloads_list = DownloadItem.objects.all()
    context = {'downloads_list': downloads_list}
    return render(request, 'mainstore/index.html', context)

在我的模板中,我想获得以下内容:

{{ downloads_list.downloadItemSample_set.all().order_by('order')[0] }}

我也想迭代数组,但对于这个示例,我使用索引0

我正在考虑编写自定义模板标记,但我认为这不是最好的方法。我想我可以为DownloadItem模型编写一个方法,它接受一个索引并返回正确的DownloadItemSample对象,但目前我也无法创建这个。

解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您永远无法实现downloads_list.downloadItemSample_set,因为downloads_list是一个查询集。

实现这一目标的一种方法是:

{% for download in downloads_list %}
    {{ download.get_sample_by_order }}
{% endfor %}

此处get_sample_by_order是类DownloadItem中的辅助方法,它返回我们需要的值。

class DownloadItem(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    downloadItem = models.ImageField(upload_to='./images/downloadItems', blank=True)

    def __unicode__(self):
        return self.name

    def get_sample_by_order(self):   
        if self.downloaditemsample_set.count():
            return self.downloaditemsample_set.order_by('order')[0]