0

オブジェクトの他のフィールドのロジックを使用して、Django のモデル レイヤーにロジックを埋め込む方法はありますか? これは複雑に聞こえるので、サンプルコードをいくつか書きました。私は継承を使用したくありません.1つを除くすべてのフィールドが共有されており、物事が複雑になりすぎます。

class Creature(models.Model):
    numberOfEyes = models.IntegerField()
    type = models.CharField(max_length=30, choices=TYPE_CHOICES)

これは私が達成しようとしているものであり、機能することを意図したものではありません

if self.numberOfEyes == 1:
    TYPE_CHOICES = (
     ('cyclops', 'cyclops')
)
else:
    TYPE_CHOICES = (
    # You get the idea
)

このロジックをモデル層に埋め込む方法はありますか? または、これをフォームで定義する必要がありますか?

4

1 に答える 1

0

フィールドが実際に異なるモデル間で共有されている場合は、継承を使用することをお勧めします。

ただし、モデルごとに異なる選択肢が必要なように見えるため、この場合継承は機能しません。

以下にいくつかのオプションを示します。

  1. typeモデルごとに異なるフィールドを用意するだけです。いくつかのモデルしかない場合は、シンプルなのでこれが最適です。

  2. 文書化されていない Django 内部をいじくり回します。Django がこの変数または変数の使用方法を変更すると、コードが壊れてしまうため、これはお勧めしません_choices__init__()とにかく、ここにこれのためのいくつかの擬似コードがあります:

    class Creature(models.Model):
    
        numberOfEyes = models.IntegerField()
        type = models.CharField(max_length=30)
    
        def __init__(self, *args, **kwargs):
              super(MyModel, self).__init__(*args, **kwargs)
              for f in self._meta.fields:
                  if f.name == "type":
                      f._choices = ('choice1', 'choice2')
    
  3. メタクラスを使用してモデルを構築します。メタクラスは、クラスを作成するために使用されるクラスです。おそらく機能しないため、このための Metaclass 疑似コードを考え出すことさえしません。Django には独自のメタクラスがあり、メタクラスの継承は複雑です。ただし、タイプ フィールドに使用する選択肢を指定するクラス レベルの変数を使用して、カスタム メタクラスにタイプ フィールドを作成することが考えられます。カスタム メタクラスを使用するための疑似コードを次に示します。

    class Creature(models.Model):
        __metaclass__ = MyMetaClass
    
        TYPE_CHOICES = ('choice1', 'choice2')
    
        numberOfEyes = models.IntegerField()
        type = models.CharField(max_length=30)
    
于 2013-07-28T08:47:36.703 に答える