我可以在django模型字段中添加一些任意属性吗?
例如:
charField = models.CharField('char field', max_length=1024, aaaaa=true)
我可以添加属性aaaaa吗?
这可行吗?
答案 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):
所以你不能传递自定义参数。
答案 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
开始的行为。