我可以给django模型域添加一些任意属性吗?例如:
charField = models.CharField('char field', max_length=1024, aaaaa=true)
我可以添加属性aaaaa吗?这可行吗?
tsm1rwdh1#
如果选中CharField
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对象)只接受命名参数。
**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):
因此您不能传递自定义参数。必须创建自定义字段
f3temu5u2#
您可以将其作为属性分配给字段对象本身:
charField = models.CharField('char field', max_length=1024) charField.aaaaa = True
或者,如果您想要一个liner,请创建一个函数,例如:
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)
xiozqbni3#
如果你看一下/django/db/models/fields/init.py,你会发现这样的行为并不像Field那样。init只接受预定义的参数。当然,您可以自由地编写自己的自定义字段(https://docs.djangoproject.com/en/dev/howto/custom-model-fields/)。
j91ykkif4#
这对我很有效:
class SpecialCharField(models.CharField): def __init__(self, *args, **kwargs): self.aaaaa=kwargs.pop('aaaaa',false) super(SpecialCharField,self).__init__(*args, **kwargs) class ModelXY(models.Model): charField = SpecialCharField('char field', max_length=1024, aaaaa=true)
q8l4jmvw5#
你没有提到你希望这个属性 * 实际上 * 做什么。一般来说,如果您试图定制CharField的行为,而它不是CharField提供的现成功能,那么您需要创建自己的CustomCharField来扩展models.CharField并实现您期望从aaaaaaa=True获得的行为。
CustomCharField
models.CharField
aaaaaaa=True
5条答案
按热度按时间tsm1rwdh1#
如果选中
CharField
它接受
**kwargs
,但也调用super
,并且继承的__init__
(Field
对象)只接受命名参数。因此您不能传递自定义参数。
必须创建自定义字段
f3temu5u2#
您可以将其作为属性分配给字段对象本身:
或者,如果您想要一个liner,请创建一个函数,例如:
然后用途:
xiozqbni3#
如果你看一下/django/db/models/fields/init.py,你会发现这样的行为并不像Field那样。init只接受预定义的参数。
当然,您可以自由地编写自己的自定义字段(https://docs.djangoproject.com/en/dev/howto/custom-model-fields/)。
j91ykkif4#
这对我很有效:
q8l4jmvw5#
你没有提到你希望这个属性 * 实际上 * 做什么。
一般来说,如果您试图定制
CharField
的行为,而它不是CharField
提供的现成功能,那么您需要创建自己的CustomCharField
来扩展models.CharField
并实现您期望从aaaaaaa=True
获得的行为。