3

15 の同様のフィールドを持つモデルを作成する必要があります (それらfield_01field_02field_03、 などと呼びましょう)。また、これらのフィールドを簡単に利用できるようにする必要があります (たとえば、 のようなことができるようにするためobj.field_01)。私は何かをすぐに軌道に乗せたかったので、愚かな方法でそれらを作成しました:

class M (models.Model):
    ....
    field_01 = models.NullBooleanField()
    field_02 = models.NullBooleanField()
    ....

これを行うためのより良い方法をオンラインで検索しました。use と言う人もいますsetattrが、読んで試してみた限りでは、これはクラス自体ではなく、クラスのインスタンスに属性を追加します。つまり、モデルフォームをこのモデルにアタッチしようとすると、で追加されたフィールドは表示されませんsetattr。次に、関数をオーバーライドしてみ__new__ました。これにより、クラスのインスタンスが作成される前にクラスにプロパティを追加できます。しかし、これを正確に行う方法を理解できませんでした。

では、South とモデル フォームを壊すことなく、コピー アンド ペーストせずにこれらのフィールドを生成する方法は何でしょうか?

4

3 に答える 3

3

あなたが何をしているかの具体的な例なしで断定的に言うのは難しいですが、一般的に、フィールドを繰り返していることに気付いた場合、それは1対多または多対多の関係の明確な兆候です:

一対多

class Field(models.Model):
    m = models.ForeignKey(M, related_name='fields')
    field = models.NullBooleanField()

多対多

class Field(models.Model):
    field = models.NullBooleanField()

class M(models.Model):
    fields = models.ManyToManyField(Field)
于 2012-08-10T19:00:39.597 に答える
1

Django モデルには、add_to_classあなたがやりたい方法でモデルにモンキー パッチを適用するために (ab) 使用できる方法があります。

for i in range(1, 10):
    M.add_to_class('field_%s' % s, NullBooleanField())
于 2012-08-10T18:25:36.803 に答える
0

EAV スタイルのデータベースを探しているようです。独自のライブラリを作成するのではなく、ライブラリを試す必要があります。その点で、Django EAV は非常に優れています。https://github.com/mvpdev/django-eav

このチェックアウトを達成するための多数のライブラリの長所と短所について詳しく読むには: https://stackoverflow.com/a/7934577/884453

于 2012-08-10T19:17:32.760 に答える