Python Django自定义模型字段-获取一个;属性名称必须为字符串;错误
因此,我创建了一个扩展CharField的定制ModelField,以获得更好的空字符串验证,并允许我对其运行定制业务逻辑验证和清理。代码如下:Python Django自定义模型字段-获取一个;属性名称必须为字符串;错误,python,django,Python,Django,因此,我创建了一个扩展CharField的定制ModelField,以获得更好的空字符串验证,并允许我对其运行定制业务逻辑验证和清理。代码如下: class CustomTextField(models.CharField): 10 def __init__(self, *args, rule="TextRule", **kwargs): 11 self.rule = rule 12 super().__init__(args, kwargs)
class CustomTextField(models.CharField):
10 def __init__(self, *args, rule="TextRule", **kwargs):
11 self.rule = rule
12 super().__init__(args, kwargs)
13
14 def deconstruct(self):
15 name, path, args, kwargs = super().deconstruct()
16 # Only include kwarg if it's not the default
17 if self.rule != "TextRule":
18 kwargs['rule'] = self.rule
19 return name, path, args, kwargs
20
21 def validate(self, value, model_instance):
22 super().validate(value, model_instance)
23 # skip special cases here
24 if self.blank and self.rule == TextRule:
25 return
26 rule_module = __import__("webapp.rules", fromlist=['blah'])
27 class_ = getattr(rule_module, self.rule)
28 rule = class_(value)
29 result = rule.validate()
30 if result != "":
31 raise ValidationError(result)
32
33 def clean(self, value, model_instance):
34 value = super().clean(value, model_instance)
35 rule_module = __import__("webapp.rules", fromlist=['blah'])
36 class_ = getattr(rule_module, self.rule)
37 rule = class_(value)
38 return rule.clean()
其思想是,它基本上是一个CharField,默认情况下运行我的TextRule对象,但可以被重写以运行其他文本类型规则(例如电话号码、电子邮件等),以执行自定义验证和数据清理
但每当我将此字段指定给模型属性时,会覆盖规则:
zip_code = CustomTextField(rule="ZipCodeRule", max_length=5)
django服务器不断向我发送以下消息:
File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/base.py", line 156, in __new__
new_class.add_to_class(obj_name, obj)
File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/base.py", line 321, in add_to_class
value.contribute_to_class(cls, name)
File "/home/blah/python37env/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 743, in contribute_to_class
if not getattr(cls, self.attname, None):
TypeError: getattr(): attribute name must be string
当我尝试运行makemigrations时也会发生同样的情况。因为错误中引用的django源代码不容易理解,所以现在完全被难住了。至少,您的超级调用是错误的:它应该是
super()。\uuu init\uuu(*args,**kwargs)
(带星号)。非常感谢您,@Daniel Roseman,解决了这个问题。:)除了不熟悉Django之外,我对Python更高级的特性(如解包)也有点陌生。