将自定义属性添加到django模型字段

mil*_*c88 6 django django-models

我可以在django模型字段中添加一些任意属性吗?

例如:

charField = models.CharField('char field', max_length=1024, aaaaa=true)
Run Code Online (Sandbox Code Playgroud)

我可以添加属性aaaaa吗?

这可行吗?

Fal*_*gel 5

如果您检查 CharField

class CharField(Field):
    description = _("String (up to %(max_length)s)")

    def __init__(self, *args, **kwargs):
        super(CharField, self).__init__(*args, **kwargs)
        self.validators.append(validators.MaxLengthValidator(self.max_length))
Run Code Online (Sandbox Code Playgroud)

它接受**kwargs但也可以调用,super并且Inherited __init__Field对象)仅接受命名参数。

class Field(object):
    def __init__(self, verbose_name=None, name=None, primary_key=False,
        max_length=None, unique=False, blank=False, null=False,
        db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
        serialize=True, unique_for_date=None, unique_for_month=None,
        unique_for_year=None, choices=None, help_text='', db_column=None,
        db_tablespace=None, auto_created=False, validators=[],
        error_messages=None):
Run Code Online (Sandbox Code Playgroud)

因此,您不能传递自定义参数。

您必须创建一个自定义字段


ica*_*ine 5

您可以将其作为属性分配给字段对象本身:

charField = models.CharField('char field', max_length=1024)
charField.aaaaa = True
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要一个衬垫,请创建一个函数,例如:

def extra_attr(field, **kwargs):
  for k, v in kwargs.items():
    setattr(field, k, v)
  return field
Run Code Online (Sandbox Code Playgroud)

然后使用:

charField = extra_attr(models.CharField('char field', max_length=1024), aaaaa=True)
Run Code Online (Sandbox Code Playgroud)