Django-Rest-Framework,POST操作:字段不为空,但DRF表示是必需的

时间:2016-06-02 08:40:00

标签: python django post django-rest-framework

好吧,我有模型

class Application(models.Model):
    name = models.CharField("nom", unique=True, max_length=255)
    sonarQube_URL = models.CharField("Url SonarQube", max_length=255,
                                 blank=True, null=True)

    def __unicode__(self):
        return self.name

序列化程序

class ApplicationSerializer(serializers.ModelSerializer):
    nom = serializers.CharField(source='name', required=True, allow_blank=True)
    url_sonarqube = serializers.CharField(source='sonarQube_URL', required=False)
    flows = FlowSerializer(many=True, read_only=True)

    class Meta:
        model = Application
        fields = ('id', 'nom', 'url_sonarqube', 'flows')

我的观点很简单:

class ApplicationViewSet(viewsets.ModelViewSet):
    queryset = Application.objects.all()
    serializer_class = ApplicationSerializer

我在 settings.py

中使用此权限模式
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.DjangoModelPermissions',),
    'PAGE_SIZE': 10,
    'TEST_REQUEST_DEFAULT_FORMAT': 'json',
    'TEST_REQUEST_RENDERER_CLASSES': (
    'rest_framework.renderers.MultiPartRenderer',
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.TemplateHTMLRenderer'
    )
}

当我在DRF界面上使用POST操作时(在HTML表单中),我填写了应用程序项的所有字段。如您所见,“nom”的“required”参数设置为True。而且,这就是问题所在:即使'nom'不为空,DRF也说“这个领域是必需的!”。所以,我不能POST一个新的应用程序项。 我不明白为什么它不起作用......错误在哪里?

2 个答案:

答案 0 :(得分:1)

尝试将您的代码保留为英文,您可以使用Django的i18n翻译内容,也可以使用空白和null作为您的姓名字段:

class Application(models.Model):
    name = models.CharField(_('name'), max_length=255, blank=True, null=True)
    sonarqube_url = models.CharField(_('SonarQube URL'), max_length=255, blank=True, null=True)

    def __unicode__(self):
        return self.name


class ApplicationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Application
        fields = ('id', 'name', 'sonarqube_url')

让我们稍后保存流量,因为你甚至没有它们的模型关系。

答案 1 :(得分:1)

您收到的错误与Django Model(Application)有关。它在模型级别而不是在序列化程序级别中失败。将null=Trueblank=True添加到name模型中的Application字段。