0

Django でモデルを処理する最良の方法は何なのか、興味があります。テレビ番組のリストを扱うアプリを作りたいとしましょう。モデルを処理する 1 つの方法は、

class TVShow(models.Model)  
     channel = models.CharField()  
     show_name = models.CharField()  
     season = models.CharField()  
     episode = models.CharField()

これは、すべてがきれいに梱包されるという利点があります。ただし、すべてのチャンネルまたはすべての show_names のリストを表示したい場合は、TVSHow オブジェクトを調べて重複を削除する必要があります。

一方、

class CommonModel(models.Model)
    name = models.CharField()

    class Meta:
        Abstract = True

class Channel(CommonModel)
    show_name = models.ManyToMany(ShowName)

class ShowName(CommonModel)
    seasons = models.ManyToMany(Seasons)

class Season(CommonModel)
    episodes = models.ManyToMany(Episodes)

class Episode(CommonModel)

これにより、無関係なデータについて心配することなく、すべての ShowNames またはすべての Channels を簡単に表示できます。ただし、逆にマッピングしない限り、番組がどのチャンネルであるかを確認するのははるかに困難です。

これを行うための「pythonic」またはDjangoの推奨方法はありますか? スペース、速度などの点で利点はありますか?

ありがとう!

4

2 に答える 2

2

あなたの最初の刺し傷は問題ないようです。つまり、使用できます

class TVShow(models.Model)  
     channel = models.CharField()  
     show_name = models.CharField()  
     season = models.CharField()  
     episode = models.CharField()

そして、django orm を使用して、探していたクエリを実行できます。

つまり、重複のないすべてのチャネルが必要な場合は、

TVShow.objects.distinct('channel')

distinct()の Django ドキュメント。

パフォーマンスに関する限り、これはデータベースに効果的に実行させるため、これを行う方法です。データベースはこれらの目的のために設計されており、コードでトリミングするよりもはるかに高速です。

于 2012-08-01T22:23:32.477 に答える
1

パフォーマンスに関連しない限り、正規化されたデータベース構造を使用するための推奨される方法です。これにより、コードでより複雑なクエリを簡単に作成できるようになります。ForeignKey と ManyToManyField は「related_name」引数を受け入れます。

class Channel(models.Model):
    pass

class Show(models.Model):
    # this means you can have same show on different channels
    channels = models.ManyToManyField(Channel, related_name='shows')

class Episode(models.Model):
    # this means that one episode can be related only to one show
    show = models.ForeignKey(Show, related_name='episodes')

Channel.objects.filter(shows__name='Arrested Development')
Channel.objects.get(name='Discovery').shows.all()
Show.objects.get(name='Arrested Development').episodes.all()
#2 db queries, 1 join
Episode.objects.get(name='Arrested Development S01E01',
                    select_related='show').show.channels.all() 
#1 db query, 3 joins
Channel.objects.filter(shows__episode__name='Arrested Development S01E01')

等々...

于 2012-08-01T22:46:59.653 に答える