2016-07-21 7 views
-1

あなたが出版社であり、複数の種類の記事を持っているとします。Djangoモデルの複数のバリアントを設計する方法

標準品、後援記事、レビュー

そして主催の記事は、スポンサーを言うと

をpromotion_end_dateとレビューは、製品のリターンアドレスと同様に、フィールドのみいくつかの他のレビューを持っている、いくつかの後援専用フィールドを持っている

どのようにこれを設計しますか?

私はこの問題を数回見つけましたが、私はいつもすべてのフィールドが利用可能ですが必須ではない1つのモデルでやります。 しかし、それは管理者と間違いの余地を残すので、ちょうど悪いと感じます。商品の返品先住所が記入されていてレビューではない場合はどうなりますか?

ほとんどの場合、フィールドセットの90%が同じものなので、非常に似たオブジェクトを一緒に照会することができます。これらのモデルは、ほぼ常に一緒に照会されます

:最も人気のある

EDITを見つけるようなもののために、その非常に役立ちます。だから、別のテーブルにそれらを入れて、それを回避するのは意味がありません。 これらは同じテーブルにあり、索引付けされている必要があります。 それ以外の場合、すべてのリクエストは1つではなく3つのクエリを実行します。その後、クエリを後でマージしソートする必要があります。

+0

可能性のある重複したのと同じ方法で、あなたの他のモデルを持つことができます(http://stackoverflow.com/questions/37747427/display-objects-from-other-models-at-the-same-page-per-to-the-publies) – e4c5

+0

その投稿は3つの異なるモデルを使用していると仮定しているので重複していません。クエリ。 3つのモデルがキューの3倍を意味するので、データベースクエリを最小限に抑えるために、非常に似たモデルを設計する最良の方法があります。 – straykiwi

答えて

1

名前を付けた後続の他のモデルによって継承できるベースモデルは、常に1つのモデルを持つことができます。あなたの場合。

class BaseArticle(models.Model): 
    class Meta: 
     abstract = True 
    fields that are common to the models that will be inheriting this 


class StandardArticle(BaseArticle): 
    fields specific to StandardArticle 

あなたは[彼らの公表の日付によると、同じページの異なるモデルから表示オブジェクト]のStandardArticle

+0

しかし、それらは依然として別のデータベーステーブル したがって、一緒に照会することはできません – straykiwi

+0

もちろん、抽象基本クラスを照会することはできません。実際には、具体的な基底クラスを使用することができます。 –

+0

異なるタイプのすべてを照会する必要がある場合は、どのように行うのですか? – straykiwi

1

使用abstract base classes

class ArticleBase(models.Model): 
    # fields 

    class Meta: 
     abstract = True 

class Article(ArticleBase): 
    pass 

class SponsoredArticle(ArticleBase): 
    # additional fields 

class Review(ArticleBase): 
    # additional fields 

またはmulti-table inheritance

class Article(models.Model): 
    # fields 

class SponsoredArticle(Article): 
    # additional fields 

class Review(Article): 
    # additional fields 

は後者のケースでは、すべてのarticlesArticle.objects.select_related('sponsoredarticle', 'review').all()とを照会することができます(select_related(...)毎回入力を避けるために、カスタムマネージャを作成することができます)。子クラスにアクセスする際にDB照会を避けるためには、select_related()が必要です。 g。 aricle.review

関連する問題