【发布时间】:2016-02-13 06:41:58
【问题描述】:
我正在使用 Django REST 框架在我的数据库/Django 模型上运行 CRUD 进程。我存储客户端数据的模型非常简单,只有一个字段给我带来了问题:用于存储自定义或自动生成的字符串的 CharField。
class Client(models.Model):
link = models.CharField(max_length=254, default=link_generator())
我使用表单输入向/clients/ 端点发出 POST 请求 - 如果用户通过输入输入自定义字符串,它会按预期存储该字符串。如果他们将此字段留空,那很好 - 我想运行我的 link_generator 函数,该函数会创建一个随机字符串(下面的代码)。 相反,我收到一个错误 - Django REST Framework GUI 告诉我,“此字段可能不是空白的。” 但我没有在任何地方指定它应该是必需的。如果我检查序列化程序,它会明确表示不需要:
>>> from landing.serializers import ClientSerializer
>>> serializer = ClientSerializer()
>>> print(serializer)
ClientSerializer():
id = IntegerField(label='ID', read_only=True)
name = CharField(max_length=50, required=False)
email = EmailField(max_length=254, required=False)
notes = CharField(allow_blank=True, required=False, style={'type': 'textarea'})
link = CharField(max_length=254, required=False)
link_expired = BooleanField(required=False)
created = DateTimeField(read_only=True)
updated = DateTimeField(read_only=True)
更新:添加带有建议改进的序列化程序代码 - 非常基本:
class ClientSerializer(serializers.ModelSerializer):
class Meta:
model = Client
fields = ('id', 'name', 'email', 'notes', 'link', 'link_expired', 'created', 'updated')
extra_kwargs = {
'link': {
'required': False,
}
}
Still, upon submitting I get this error every time. 是什么让它认为该字段是必需的?同样,我想允许用户将此字段留空,如果他们这样做,则运行 link_generator 函数。如果我明确地说blank=True如下:
link = CharField(max_length=254, blank=True, default=link_generator())
...link_generator 没有运行,并且最终存储了一个空白字符串。对于它的价值,这是我想在用户将输入留空的情况下运行的 link_generator 代码(旁注:我在模型上方声明了这个 - 这是不好的做法吗?应该在哪里声明):
def link_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
有什么见解吗?我很难过 - 只是不明白为什么它应该被这样标记。一般来说,我对 Django 和 REST 比较陌生 - 感谢您的帮助。
【问题讨论】:
-
您可以更新您的帖子并从您的 serializers.py 文件中包含您的 ClientSerializer() 吗?我知道你打印了序列化程序,但以防万一......
标签: python django rest django-rest-framework