我正在开发一个应用程序来帮助我学习Django...basically,它只是我拥有的各种媒体的列表(CD、DVD、书籍、设备等等)。当然,这是完全没用的,但我正在尝试在一个“真实世界”的应用程序中找到我可能找到的所有东西。
我想做的是有一个主列表视图,它将从每个类别中选择几个项目。比如说5张CD,5本书,等等,然后把它们混成一张清单。
想到的第一件事就是查询它们,并通过上下文传递它们:
{“书籍”:Book.objects.all(),“DVD”:DVD.objects.all(),#等,等等,}
但我不得不认为这是完全没有效率的。有没有一种更好/更快的方法不会对DB造成如此大的冲击?也许是一种创建“超级”模型的奇特方法,它将轮询其他模型并生成一个列表?或者别的什么?
或者Django会缓存这个请求-- anyway...so --它不会每次请求页面时都命中DB?
那么使用继承呢?
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发布于 2013-11-07 04:10:05
您可以创建类似于产品模型的东西,该模型可以对CD、DVD、图书等进行分组,并使用泛型关系来表示:
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或图书中创建产品:
>>> 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()}和引用项,以获得模板中的每个对象:
{% for product in products %}
{{ product.item }} {# can be DVD or Book #}
{% endfor %}请记住,虽然优雅,但这并不是最有效的方法(它也不会有糟糕的性能),Django可以查询数据库以获得item对象。我不确定使用select_related是否有帮助。
关于缓存,Django不会自动缓存请求,您需要自己设置缓存,但是做起来很容易 :-)
完成缓存设置后,只需使用装饰师对你的看法即可。
你可以用仅在列出项目的模板中缓存片段代替,我认为这是最有效的。
https://stackoverflow.com/questions/19827652
复制相似问题