2016-02-10 30 views
7

お客様が私たちが提供するdjangoモデルにカスタムフィールドを追加したいと考えています。カスタムフィールドをdjangoモデルに追加する(ソースコードを変更せずに)

彼はプログラミングせずにこれを自分自身で実行したいと考えています。

これらの事は追加可能でなければなりません:

  • ブール(はい/いいえ)フィールド。オプションの "未設定"
  • 単一選択フィールド
  • 複数の選択肢フィールド
  • 1行のテキストフィールド
  • TEXTAREAフィールド

例:

顧客がしたいです彼が「成功した」と呼ぶフィールドを追加します。フィールドには、yes/no/unsetという選択肢があります。デフォルトは未設定です。

モデルを作成したり拡張したりすれば簡単にできます。 ?しかし、この場合には何のソースコードの変更は

:-(許可されません

これを解決する方法を更新

与えられた値を持つインスタンスのクエリをサポートする必要があります。例:どこのすべてのインスタンスを表示しますTrueで "成功した"。

+1

あなたは何のソースコードも言いません変更...確実あなたは、何かが追加されるために何かが変わらなければならないと受け入れますか?十分なJSONFieldですか? – Sayse

+0

私は質問を更新しました。クエリをサポートする必要があります。 JSONFieldがこれをサポートしているかどうかは不明です。 – guettli

+1

それは、顧客が求めているものが実際に彼らが望むものではない場合のように聞こえる。 – Sayse

答えて

0

それはあなたが望む本当にだ場合。

  1. が電子を作成します。あなたの顧客が今まで必要としてきた分野はありません。

    boolean_field_1 = models.BooleanField(..) 
    boolean_field_2 .. 
    date_field_1 = .. 
    date_field_2 = .. 
    
  2. エイリアスマッピングをどこかに保存します。

    エイリアスマッピングのフィールドを追加できます。

    json_mapping_field = JSONField() 
    # this has is_successful: boolean_field_1 
    
  3. その後、あなたは単純なフィルタおよび更新のために戻って実際のフィールド名

    の別名に置き換えることができる場所を見つけ、あなたは

    1. QuerySet.filter Queryset.exclude
    2. をオーバーライドすることができます
    3. QuerySet.update、UpdateQuery.add_update_values
    4. 最後に、マネージャーがoveridden QuerySetを使用するためにfrom_querysetを使用します。私はDjango Dynamic Formsを使用
+0

これはうまくいく可能性があります。しかし、おそらく、あなたは "boolean_field_1"、 "boolean_field_2"、...の代わりに各データ型に対して1つのモデルを作成することができます。背景:おそらく1つの顧客は20 boolean_fieldsを望んでいます... – guettli

+0

または可能なフィールドを配布する異なるスキームを考えることができます。これがアンケートアプリのためのものであれば、クライアントは異なる*フィールドニーズ*基準を持つ質問のタイプを知っているかもしれません。マッピングルールを持つことができる限り、任意のフィールドセットをテーブルに配布することができます。 – eugene

+0

最大10ブール値、最大100ブール値のテーブルを持つこともできます。10未満または100未満の値を必要とする場合は10を使用します。(手順3でマッピングルールを実装できる限り) – eugene

2

。すぐに使用できるので、ユーザーは管理者から独自のフォームを作成できます。ユーザーフレンドリーなUIを構築するためにそれを拡張したいかもしれませんが、これはあなたをかなり遠くにさせるでしょう。それは

  • 時間は電子メール
  • 整数
  • 一行

    • ブール
    • 選択肢(選択)
    • 複数の選択肢(複数選択)
    • 日時
    • をサポートしていますテキスト
    • 複数行のテキスト
  • 7

    あなたはEAV principle(エンティティ属性値)を下記の表を作成することができます。 [ID(および/またはスラグ)、FLOAT_VALUE、INTEGER_VALUE、STRING_VALUE](この表に複数の列を追加します)

    は今、あなたは、「メンバーと呼ばれる既存のテーブルをしたと言う
    :基本的にはこれは、次の列を持つdenormalisedテーブルです"顧客がUIを介してダイナミックフィールドを追加する場合は、ここにエントリを追加し、「ID」を使用して特定のメンバーを検索します。

    2

    私はこのような問題が発生したとき、名前フィールドとタイプフィールドを持つカスタムフィールドモデルを作成しました。通常は、選択可能なフィールドタイプの選択肢があります。 is_activeフィールドを追加して、アクティブおよび非アクティブCustomFieldをフィルタすることもできます。

    forを作成するより、このオブジェクトを検索して、そのフィールドに必要なフィールドを知ります。

    データを保存するには、CustomFieldAnswerという別のモデルを使用するか、このようにしてください。このモデルには、このデータとカスタムフィールドを持つ必要があるメインモデルのForeignKeyが必要です。

    そうすることで、あなたはどのような種類のフィールドをdinamicallyかつあなたが何かをコード化する必要がないようにすることができます。

    メタプログラミングを使用して、CustomFieldsのクエリに基づいてフォームに実際のフィールドを作成することができます。または、テンプレートにフィールドを置き、各CustomFieldの入力のタイプを変更するだけでもかまいません。

    希望に役立ちます!

    0

    ひどいハックのように聞こえるかもしれませんが、テキストファイルを作成するインターフェイスを構築できますか?

    1. 1つのファイルがモデル定義と、models.pyこと、およびmanaged = False
    2. 別のファイルと移行から、このモデル除くDROPとSQLで、顧客が新しいテーブルを望んでいる場合は、テーブルを作成するか、または単に変更するであろう表。
    3. 別のスクリプトでSQLスクリプトを実行し、models.pyファイルを正しいディレクトリにコピーし、djangoをリロードすることができます。
    +0

    ダウン投票?よくある質問ではありません。共通の解決策を必要としません。 –

    0

    私はこのことについてdjangopackages上でも比較グリッドがあることを発見:

    https://www.djangopackages.com/grids/g/dynamic-models/

    見出し:

    アプリは設定でモデルにフィールドを追加、またはします実行時でも。

    一部のStackOverflow管理者がこの回答を削除しました。そのため、私は再度書きます。

    削除の理由ました:

    このリンクは質問に答えるかもしれないが、ここでは答えの重要な部分が含まれており、参考のためにリンクを提供することをお勧めします。リンクされたページが変更された場合、リンクのみの回答は無効になります。ここで

    今日比較グリッドに上場されている現在のパッケージです:

    +0

    この回答がダウン投票された理由を教えてください。これはリンクのみの回答ではありません。 – guettli

    関連する問題