0

として知られているテーブルがありますmessages。私のアプリケーションでは、ユーザーはさまざまな種類のメッセージを送信できます。イベントの転送などのように。そのため、列typevalueそのテーブルがあります。

私がやりたいのはtype、特定のテーブルに移動し、valueが有効であることを確認することです(通常、これはそのテーブルのにマップされidます)。複数のタイプが存在する可能性があり、それぞれを異なるテーブルにマップする必要があります。組み込みのdjangoORMでこれを論理的に書く方法はありますか?今のところ、これはストレートSQLを使用している場合にのみ実現可能であると考えていますが、それを回避できれば実現可能ではありません...

今、私は次のようなことをしています。

Messages.objects.all().filter(Q(user_id=id))...etc

上記のステートメントに追加したいのですがtype、特定typeの場合は、それに関連付けられているテーブルを確認してください。

4

2 に答える 2

1

あなたは「ポリモーフィックな関係」を持っているようですね。Djangoで類似したことを行うにはいくつかの方法がありますが、あなたが説明したものに最もよく一致するのは、アプリケーションのようにタイプと値に別々の列を使用するcontenttypesモジュールだと思います。

于 2012-10-19T17:01:24.037 に答える
0

マルチテーブル継承構造を定義したいだけかもしれません。これにより、複数のタイプのメッセージとフィールドの継承があるという点で同じ結果が得られますが、typeフィールドをいじる必要はまったくありません。

class Message(models.Model):
    value = models.CharField(max_length=9000)

class Event(Message):
    pass

class Tweet(Message):
    pass

ビューポストハンドラー:

...
if request.POST['type'] == 'event':
    Event.objects.create(value=request.POST['value'])
elif request.POST['type'] == 'tweet':
    Tweet.objects.create(value=request.POST['value'])
...

次に、オブジェクトを取得します。

all_tweets = Tweet.objects.all()
all_messages = Message.objects.all()

for message in all_messages:
    try:
        event = message.event
    except Event.DoesNotExist:
        # this message is not an Event
        pass

この種の構造が機能しない場合、Djangoでサポートされているモデル継承には他に2つのスタイルがあります。抽象基本クラスプロキシモデルです。@AndrewGorcesterによって提案されているように、GenericForeignKeyを保持することもできます。

于 2012-10-19T18:11:25.360 に答える