0

Django の学習に役立つアプリを作成しています...基本的には、所有しているさまざまなメディア (CD、DVD、本、デバイスなど) のリストにすぎません。もちろん、それはまったく役に立ちませんが、「現実世界」のアプリで見つけられる可能性のあるすべてのものを見つけようとしています.

私がやりたいことは、各カテゴリからいくつかの項目を選択するメイン リスト ビューを用意することです。5 枚の CD、5 冊の本などを 1 つのリストにまとめます。

最初に頭に浮かぶのは、それらすべてをクエリして、コンテキストを介して渡すことです。

{"本": Book.objects.all(), "DVD": DVD.objects.all(), #etc etc, }

しかし、これではまったく効率が悪いと思わざるを得ません。DBにそれほど大きな打撃を与えない、より良い/より高速な方法はありますか? おそらく、他のモデルをポーリングしてリストを生成する「スーパー」モデルを作成する素晴らしい方法でしょうか? か何か?

それとも、とにかく Django はこのリクエストをキャッシュしますか?そのため、ページがリクエストされるたびに 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
4

1 に答える 1

0

CD、DVD、書籍などをグループ化できるProductモデルのようなものを作成し、一般的な関係を使用してそれを表すことができます。

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: の queryset{'products': Product.objects.all()}と reference itemを渡すだけで、テンプレート内の各オブジェクトを取得できます。

{% for product in products %}
    {{ product.item }}  {# can be DVD or Book #}
{% endfor %}

エレガントではありますが、これは最も効果的な方法ではありません (パフォーマンスがまったく低下するわけではありません)。使用select_relatedが役立つかどうかはわかりません。

キャッシュに関しては、Django はリクエストを自動的にキャッシュしません。自分でキャッシュを設定する必要がありますが、非常に簡単です:-)

キャッシュのセットアップが完了したら、ビューでデコレータを使用するcache_pageだけです。

代わりに、アイテムがリストされているテンプレートのフラグメントのみをキャッシュすることができます。それが最も効率的だと思います。

于 2013-11-07T04:10:05.223 に答える