首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多模型单视图

多模型单视图
EN

Stack Overflow用户
提问于 2013-11-07 03:46:48
回答 1查看 64关注 0票数 0

我正在开发一个应用程序来帮助我学习Django...basically,它只是我拥有的各种媒体的列表(CD、DVD、书籍、设备等等)。当然,这是完全没用的,但我正在尝试在一个“真实世界”的应用程序中找到我可能找到的所有东西。

我想做的是有一个主列表视图,它将从每个类别中选择几个项目。比如说5张CD,5本书,等等,然后把它们混成一张清单。

想到的第一件事就是查询它们,并通过上下文传递它们:

{“书籍”:Book.objects.all(),“DVD”:DVD.objects.all(),#等,等等,}

但我不得不认为这是完全没有效率的。有没有一种更好/更快的方法不会对DB造成如此大的冲击?也许是一种创建“超级”模型的奇特方法,它将轮询其他模型并生成一个列表?或者别的什么?

或者Django会缓存这个请求-- anyway...so --它不会每次请求页面时都命中DB?

那么使用继承呢?

代码语言:javascript
复制
class Item(models.Model): 
    name = models.CharField(max_length=200) 
    date_added = models.blahblahblah 

    class Meta: 
        abstract = True 

class DVD(Item): 
    run_time = models.IntegerField() 
    director = models.blahblah 

class Book(Item): 
    publisher = etc 
    author = etc
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-07 04:10:05

您可以创建类似于产品模型的东西,该模型可以对CD、DVD、图书等进行分组,并使用泛型关系来表示:

代码语言:javascript
复制
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Product(models.Model):
    sku = models.CharField(max_length=200)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    item = generic.GenericForeignKey('content_type', 'object_id')

class DVD(models.Model):
    title = models.CharField(max_length=200)
    length = models.IntegerField()

class Book(models.Model):
    title = models.CharField(max_length=200)
    authors = models.ManyToManyField('people.Person')

然后,就像Django的文档一样,您可以从现有的DVD或图书中创建产品:

代码语言:javascript
复制
>>> adventure_time = DVD.objects.get(title='Adventure Time')
>>> adventure_time_product = Product(item=adventure_time, sku='123')
>>> adventure_time_product.save()

然后,在视图中,您可以传递一个产品的查询集:{'products': Product.objects.all()}和引用项,以获得模板中的每个对象:

代码语言:javascript
复制
{% for product in products %}
    {{ product.item }}  {# can be DVD or Book #}
{% endfor %}

请记住,虽然优雅,但这并不是最有效的方法(它也不会有糟糕的性能),Django可以查询数据库以获得item对象。我不确定使用select_related是否有帮助。

关于缓存,Django不会自动缓存请求,您需要自己设置缓存,但是做起来很容易 :-)

完成缓存设置后,只需使用装饰师对你的看法即可。

你可以用仅在列出项目的模板中缓存片段代替,我认为这是最有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19827652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档