2016-04-12 8 views
0

私はDjangoを新しくしています(データベースと一緒に遊んでから数年経ちました)、私は何をGoogleに知らないのか単純なことを踊っているかもしれません。Django - 別のモデルで抽象モデルを使用できますか?

本質的に、私は様々なタイプのデータを含むことができる "イベント"のテーブルを持っています。あるイベントが「アラーム」で、別のイベントが「メッセージ」であるとします。 「アラーム」タイプは「メッセージ」とは異なるフィールドを必要とするので、イベントに必要なデータが入っている1つの大きなテーブルにデータを格納しないと意味があるようです。しかし、私は与えられた "event_block"外部キーのすべてのイベントのリストを取得できるようにしたい。

私は抽象モデルやプロキシなどについていくつかの読書を行っていますが、抽象モデルをどのモデルがどのモデルから参照できるかはわかりません。

models.py:

class Event(models.Model): 
    #id auto-generated primary_key 
    event_block = models.ForeignKey(Block, on_delete=models.CASCADE) 
    event_data = BaseEvent # This is wrong, but what is right? 

class BaseEvent(Models.model): 
    class Meta: 
    abstract=True 
    ... common event info ... 

class AlarmEvent(BaseEvent): 
    ... event info for alarms ... 

class MessageEvent(BaseEvent): 
    ... event info for messages ... 

理想的には、私は(私のテンプレートでは、すべての利用可能なevent_typesでドロップダウンボックスを作成することができ、その後、そのイベントを作成するには、「送信」ボタンフォームをクリックします必要なイベントデータフィールドを持つ)をDjangoに渡し、Djangoがデータベーステーブルでどのように処理されるかの詳細を処理させます。

私には何が欠けていますか?

答えて

1

まず、これはEventモデル

class Event(models.Model): 
    event_block = models.ForeignKey(Block, on_delete=models.CASCADE) 
    event_data = models.ForeignKey(BaseEvent) 

しかし... abstract=TrueBaseEventが物理的に存在していませんが、AlarmEventMessageEventはありませんその子と適切です。だからBaseEventForeignKeyとして指摘できるかどうかわからない。 This post about generic foreign keyが参考になる場合があります。

第2に、モデルの構造についてです。 IMO、物事は抽象的な母親のクラスなしで簡単にすることができます。カテゴリフィールドを持つモデルはどうですか?

CATEGORY = (('field1', 'field name 1'), ('field2', 'field name 2'),) 
class Event(models.Model): 
    category = models.CharField(max_length=10, choices=CATEGORY) 
    # SOME OTHER FIELDS... 

デフォルトでは、django adminによってモデルのフォームが表示されます。

+0

おかげ - それは私がまだ遭遇していない何かを。しかし、私の "イベント"タイプには、 "イベント"のすべての異なる "カテゴリ"のすべてのデータが含まれている必要があります。 – EMon

+0

SO上の「汎用外部キー」のリンクは参考になります - 私と同様の質問のようです。このように私が望むものを得る正しい解決策になるかもしれないと思うが、それに価値がないほどの短所があるのだろうかと思う。 Djangoを使い始めると、保守性、速度、メモリなどを考慮して "正しい"解決策が何であるかを知ることは難しいです。 – EMon

1

これらの別々のテーブルの理由は何ですか?それらを直接照会するつもりですか?これらのイベントはデータを共有することになっていますか?

これらの質問に対する回答が「わからない」(または「いいえ」)の場合、別のテーブルを作成する代わりに、すべてのデータをEventモデルに直接保存するのはどうですか?

class Event(models.Model): 
    #id auto-generated primary_key 
    event_block = models.ForeignKey(Block, on_delete=models.CASCADE) 
    event_data = models.TextField() 

及び直列化形式(例えばJSON)でevent_dataフィールドのデータを保持するようなもの。または、いくつかのプラグインを使用することができます。 JSONFieldの場合はhttps://github.com/bradjasper/django-jsonfieldです。

いくつかの一般的なフィールドは、たとえば、分離することができます。CATEGORYフィールドがどのように機能するかを示すための

class Event(models.Model): 
    #id auto-generated primary_key 
    event_block = models.ForeignKey(Block, on_delete=models.CASCADE) 
    event_type = models.CharField(max_length=2) 
    event_data = models.TextField() 
+0

JSONのアイデアは、ある種のデータにとっては良いアイデアですが、私の場合、そのデータの詳細のいくつかについてクエリを実行できる必要があります。 – EMon

関連する問題