データベース駆動型の任意にネストされたテンプレート コンテキストが必要な状況に何度も遭遇しました。このコンテンツは常に非常に単純ですが、構造は大きく異なります。
過去に、私はウェブサイトの小さなセクションのモデルを作成しましたが、モデルの数が増えるとすぐに維持するのが少し悪夢になり、編集可能なコンテンツの小さな領域ごとに同じことを繰り返し始めました。管理者は、特定の部分ごとにインラインでいっぱいになります。
これを解決するために、単純な DB 駆動のコンテキスト モデルを作成したいと思います。おそらく、django の admin のような小さなフレームワークを作成して、特定の目的のためにデフォルトの構造を生成します。
私の現在のモデルは基本的に次のようになります。
class DBContext(MPTTModel):
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
key = models.CharField(max_length=256)
value = models.TextField(blank=True)
file = models.FileField(upload_to='dbcontext/files/', blank=True, null=True)
このモデルから、任意の深さの Python 辞書を簡単に作成できます。問題は、子ノードのリストとディクショナリをどのように最もよく区別するかです。子としての単一のディクショナリ、子としての値のリスト、または子としてのディクショナリのリストです。
type
子供たちが強要される余分なフィールド?
class DBContext(MPTTModel):
NONE = 0
LIST = 1
DICTIONARY = 2
COERCE_TYPES = [
(NONE, 'None'),
(LIST, 'Children as list'), # ignore keys.
(DICTIONARY, 'Children as Dictionary'),
]
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
key = models.CharField(max_length=256)
value = models.TextField(blank=True)
coerce_type = models.IntegerField(default=0, choices=COERCE_TYPES)
def to_python(self):
# when converting to python, any children of a node would be coerced into the value_type type
# Converted to python:
{
'foo': { # coerce_type == DICTIONARY
'child_node_as_dict': '',
},
'bar': [ # coerce_type == LIST
'child_node_as_list',
],
'baz': [ # coerce_type == LIST
{ # coerce_type == DICTIONARY
'child_node_list_of_dicts': '',
},
],
}
子キーで決定しますか?
- すべての子が同じキーを共有している場合、それはリストです。キーを無視します。
- 子が 1 つ以上ある場合、それは辞書です。
- 子がない場合は文字列です。
助言がありますか?
PS: 私がピクルを使わない唯一の理由は、最初からこのデータの編集を処理するために管理者を使用していて、FileField
. 真実は、私はストレージをあまり深く調べていないということです. 基本的に、ここでの私の動機は、役に立つものをすばやく作成することです。このシステムは、すべての子を強制的に辞書項目にすると、約 5 分の「骨のストック」で機能し、Web サイトの管理者が編集可能なランダムな領域を作成する際の問題を解決します。