模板中具有多对一关系的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_orderDownloadItem类中的一个辅助方法,它返回我们需要的值。

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模型的主要内容,如果未能解决你的问题,请参考以下文章

django--ORM表的多对一关系

我需要使用具有多对一关系的@Access=FIELD 注释吗?

连接两个共享多对一关系的 SQL 表

如何让jpa休眠创建具有多对一但没有外键的实体

将多个文件发布到数据库 - 多对一关系的空值

Symfony 2 多对一