2012-01-29 11 views
5

可能性の重複:
Django dynamic model fieldsDjangoエンドユーザ定義のフィールド、方法?

おはようみんな! シナリオは次のとおりです。 Djangoの一部のモデルでは、エンドユーザーが自分のフィールドを定義できるようにしたいと考えています。私がDjangoの素晴らしい機能をORMのように保つことができれば素晴らしいと思いますので、field__gteのような呼び出しをしてモデルを検索したり、フィールドのタイプに応じてフィールドの検証をしたりできます。これは私が新しい提案をするために開いている以上のものです。どんなフィードバックも非常に高く評価されます。

  1. 第1のアプローチは、Djangoは既にのためのアプリケーションを有するエンティティ属性値(http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)、です。 http://code.google.com/p/django-custom-field/ を参照してください。これは問題ありませんが、私は "mymodel.objects.filter(custom_field_x = something)"を行う能力を失います。 ORMやアイデアを取り戻す方法はありますか?しかし、私はこの方法について多くの悪い話を聞いたことがあります。

  2. 2番目の方法は、各ユーザーにデータベーステーブルを用意することです(おそらく1000を超えないようにする)。私はdjangoがinspectdbの行に何かを持っていると読んでいます。inspectdbは、実際にフィールドが存在するかどうかをチェックし、モデルを生成します。これは役に立つかもしれませんが、おそらく私はこの特定のユーザが作成したフィールドを格納し、何とかdinamically djangoに伝えるべきだと思います。ちょっと、私たちもこのモデルにこのフィールドを持っています。これは可能ですか?私はそれは一般的に各ユーザーごとに異なるテーブルを持つことは悪いことがわかっていますが、このシナリオを考えると、どのようにあなたはこのメソッドを評価するでしょう、それは各ユーザーごとに1つのテーブルを持っているでしょうか?

カスタムフィールドを必要とするモデルは、たとえばPersonです。彼らはアドレス、血液型、またはその他のものを格納するためのカスタムフィールドが必要な場合があります。

あらかじめご了承ください!良い日曜日を!

非常によく似ています:How to create user defined fields in Django - 私は避けたいEAVについてのみ話します。私は新しいアイデアのために開いている!

+1

発見された最良の参照行うことができます。申し訳ありませんが、私の質問は、その1の複製であるhttp://stackoverflow.com/questions/7933596/django-dynamic-model-fields を。モッズは、それを閉じて自由に感じる。 – Clash

答えて

1

1つのアプローチは、MongoDBなどのNoSQLドキュメントベースのソリューションを使用することです。このソリューションは、流体構造(事前定義された列などの制限はありません)を持つオブジェクトを格納できます。

長所:

  1. はNoSQLののORM機能( django-mongodb
  2. その他の様々な利点を保持するカスタムフィールドタイプ、フィールドの種類の数などに制限なし - あなたはについて読むことができますオンライン
  3. 回避のEAV

短所:

  1. NoSQLサーバーを設定する必要があります。
  2. NoSQLの概念に関する追加知識が必要ですテーブル)
  3. あなたは、2つのデータベースを維持する必要があります - あなたが決める場合のNoSQLへのあなたの全体のソリューションを移行しない(multi-db

EDIT:

に依存することを指摘し、その価値のコメントを読んだ後どのNoSQLソリューションを使用すれば、復帰のサポートは必要ありません。例えば、CouchDBはdocument versioningをサポートしています。

+0

こんにちはburhan、あなたの答えに感謝! mongodbはすばらしい。残念ながら私の共有ホスティングはそれをサポートしていません。私は今、新しいウェブホスティングを探しています(しかしそれは別の問題です)。とにかく、私が尋ねたかったのは、mongodbを使って他のアプリを壊すかどうか知っていますか?例えば、私がdjango-revisions(http://djangopackages.com/packages/p/django-revisions/)を使用しても、それでも動作しますか?事前に多くの感謝! – Clash

+1

@Clash、yes、mongodbを使用すると、NoSQL dbを使用しない外部django-appsが破損します。だから、django-revisionsは動作しません。しかし、Djangoはこれをサポートしているので、複数のデータベースを設定することができます。その唯一の問題は、これらのデータベース間で結合できないことです。 – Spike

+0

@スパイク、そうです。カスタムフィールドを使用するモデルでリビジョンを使用することはできません。返信いただきありがとうございます! – Clash

1

user_defined_fieldsを格納する別のモデルを作成するのはどうですか?

class UserDefinedField(models.Model): 
     #.................. 
     user = models.ForeignKey(User) 
     field_name = models.CharField(max_length=50) 
     field_value = models.TextField() 

次に、あなたが今までUserDefinedField.objects.filter(field_name=some_name,field_value=somevalue)

+1

これはEAVのちょっとしたバリエーションだと思います – Clash

関連する問題