2

わかりましたので、次のようなフォーラム アプリを作成したくありません。

class Section(models.Model):
    section_name = models.CharField(max_length = 200)

class Thread(models.Model):
    title = models.CharField(max_length = 200) 
    content = models.TextArea()

しかし、Threadユーザーがテキスト、リンク、画像、または画像のみを含むリンクを送信できる場所の4つのタイプが必要です。content種類によってフィールドが変わります。これを行うための最良のアプローチは何ですか? SubThreadタイプごとに定義する必要がありますか? または、次のように定義できますか:

class Thread(models.Model):
THREAD_TYPE = (
    ('text', 'Text'),
    ('link', 'Link'),
        ('imge', 'Image'),
    ('limg', 'Link Image'), 
)

type = models.CharField(max_length = 4, choices = THREAD_TYPE)
    title = models.CharField(max_length = 200) 
if self.type == 'text':
    content = models.CharField(max_length = 200)
# and so on...

ありがとうございました。

4

2 に答える 2

1

モデルの継承が必要なようです。モデルが保存されるまでタイプが設定されないため、ifステートメントは機能しません。モデルをデータベース設計と考えてください。列は、テーブルの一部だけでなく、テーブル全体に存在する必要があります。モデル継承の例を次に示します。

Class Thread(models.Model):
    title = models.CharField(max_length = 200)

    class Meta:
        abstract = True

Class ThreadText(Thread):
    content = models.CharField(max_length = 200)

Class ThreadLink(Thread):
    link = models.URLField()

詳細については、ドキュメントを参照することもできますhttps://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

于 2012-12-16T05:31:20.343 に答える
1

フィールドを条件付きにすることは絶対にできません。それがデータベースでどのように機能するか (または機能しないか) を考えてください。

タイプごとに Thread のサブクラスを作成することはオプションですが、Thread サブクラスと別のモデルとの間の関係を作成するには GenericForeignKeys を使用する必要があります。非常に高いパフォーマンスが重要な考慮事項である場合、GenericForeignKeys は同様に機能しません。

もう 1 つのオプションは、すべてのタイプ (FileField、URLField など) をサポートするように Thread を定義し、さまざまなタイプの選択肢を持つフィールドを含めることです。type フィールドを使用して、アイテムをレンダリングするテンプレートを指定したり、タイプでフィルタリングしたりできます。

于 2012-12-16T05:31:33.213 に答える