带有 Django REST Framework 的不需要的字段错误

jck*_*stl 3 python django rest django-rest-framework

我正在使用 Django REST Framework 在我的数据库/Django 模型上运行 CRUD 进程。我用于存储客户端数据的模型非常简单,只有一个字段给我带来了问题:用于存储自定义或自动生成字符串的 CharField。

class Client(models.Model):
    link = models.CharField(max_length=254, default=link_generator())
Run Code Online (Sandbox Code Playgroud)

/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)
Run Code Online (Sandbox Code Playgroud)

更新:添加带有改进建议的序列化程序代码 - 非常基本:

class ClientSerializer(serializers.ModelSerializer):

    class Meta:
        model = Client
        fields = ('id', 'name', 'email', 'notes', 'link', 'link_expired', 'created', 'updated')
        extra_kwargs = {
        'link': {
            'required': False,
         }
    }
Run Code Online (Sandbox Code Playgroud)

尽管如此,每次提交时我都会收到此错误。是什么让它认为该字段是必需的?同样,我希望允许用户将此字段留空,并在他们这样做时运行 link_generator 函数。如果我明确地说blank=True如下:

link = CharField(max_length=254, blank=True, default=link_generator())
Run Code Online (Sandbox Code Playgroud)

...link_generator 不运行,最终存储了一个空白字符串。对于它的价值,这是我想在用户将输入留空的情况下运行的 link_generator 代码(旁注:我在模型上方声明了这一点 - 这是不好的做法吗?应该在哪里声明):

def link_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))
Run Code Online (Sandbox Code Playgroud)

有什么见解吗?我很难过 - 只是不明白为什么它应该被标记为那样。总的来说,我对 Django 和 REST 比较陌生 - 感谢您的帮助。

use*_*875 5

尝试将您的序列化程序更改为:

class ClientSerializer(serializers.ModelSerializer):

    class Meta:
        model = Client
        fields = ('id', 'name', 'email', 'notes', 'link', 'link_expired', 'created', 'updated')
        extra_kwargs = {
                'link': {
                    # Tell DRF that the link field is not required.
                    'required': False,
                    'allow_blank': True,
                 }
            }
Run Code Online (Sandbox Code Playgroud)

我实际上很惊讶,当您打印序列化程序时,DRF 表示link不需要该字段,因为根据您的模型,它应该是必需的(因为blank=True未设置)。

编辑:allow_blank用于 CharField 序列化器字段的内容(如果设置为True空字符串,则应将其视为有效值)。取自此处的 DRF 文档:http : //www.django-rest-framework.org/api-guide/fields/#charfield