0

有没有办法使用对象其他字段的逻辑将逻辑嵌入到 Django 的模型层?这听起来很复杂,所以我写了一些示例代码。我不想使用继承,我所有的字段,但一个是共享的,这会使事情变得过于复杂。

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 内部结构的垃圾。ie set _choicesin__init__()我不建议这样做,因为如果 Django 更改此变量或变量的使用方式,您的代码将中断。无论如何,这里有一些伪代码:

    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 回答