模板中具有多对一关系的Django模型
Posted
技术标签:
【中文标题】模板中具有多对一关系的Django模型【英文标题】:Django model with many to one relationship in template 【发布时间】:2014-05-20 04:38:17 【问题描述】:我有两个具有一对多关系的对象:
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】:您永远无法实现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]
【讨论】:
这是一个很酷的解决方案,当我告诉你我可以在DownloadItem
上编写一个方法时,我正在考虑这个问题,但这不支持索引。您也有解决方案吗?
支持索引是什么意思?
在您的辅助方法中,您当前在返回值时使用数组的索引 0。这可以作为参数更改吗?
哦.. 为此,您可以发送一个参数并将其命名为 5|download.get_sample_by_order
- 但这对数据库层来说会非常繁重。
索引仅用于调试。我将使用get_sample_by_order
返回整个数组,然后使用for
模板对其进行迭代。你怎么看?这样可以吗?以上是关于模板中具有多对一关系的Django模型的主要内容,如果未能解决你的问题,请参考以下文章