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

时间:2013-12-19 10:24:37

标签: django django-models

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

例如:

charField = models.CharField('char field', max_length=1024, aaaaa=true)

我可以添加属性aaaaa吗?

这可行吗?

5 个答案:

答案 0 :(得分:4)

如果您选中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))

它接受**kwargs但也调用super并且继承__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):

所以你不能传递自定义参数。

您必须create a custom field

答案 1 :(得分:1)

如果您查看/django/db/models/fields/init.py,您会发现此类行为不是Field。 init 接受只有预定义的参数。

您当然可以自由编写自己的自定义字段(https://docs.djangoproject.com/en/dev/howto/custom-model-fields/)。

答案 2 :(得分:1)

也许不是最有效的方式,但这样的事情对我有用:

class SpecialCharField(models.CharField):
    def __init__(self, *args, **kwargs):
        self.aaaaa=kwargs.get('aaaaa',false)
        #delete aaaaa from keyword arguments
        kwargs = {key: value for key, value in kwargs.items() if key != 'aaaaa'}
        super(SpecialCharField,self).__init__(*args, **kwargs)


class ModelXY(models.Model):
    charField = SpecialCharField('char field', max_length=1024, aaaaa=true)

答案 3 :(得分:1)

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

charField = models.CharField('char field', max_length=1024)
charField.aaaaa = True

或者如果您想使用一个班轮创建一个函数,例如:

def extra_attr(field, **kwargs):
  for k, v in kwargs.items():
    setattr(field, k, v)
  return field

然后使用:

charField = extra_attr(models.CharField('char field', max_length=1024), aaaaa=True)

答案 4 :(得分:0)

你没有提到你希望这个属性实际上做什么。

一般来说,如果您尝试自定义CharField行为,并且不是CharField提供开箱即用的内容,则需要创建自己的{{1}扩展CustomCharField并实现您期望从models.CharField开始的行为。