Django-Rest-Framework POST 对象字段必填

Posted

技术标签:

【中文标题】Django-Rest-Framework POST 对象字段必填【英文标题】:Django-Rest-Framework POST Object Field Required 【发布时间】:2013-11-12 19:29:02 【问题描述】:

我正在使用 djangorestframework(我喜欢它),我正在尝试将一些数据从前端发布到等待接受它的 REST 视图/序列化器。

当我登录到 REST API 后端(django rest 为用户提供了能够测试他们的查询)时,我可以提交此信息,它会成功地将信息传递到后端并保存对象:


        "user": 1,
        "content": "this is some content",
        "goal": 
        
            "competencies[]": [
            32
            ],
            "active": false,
            "completed": false,
            "user": 1
        
    

但是,当我运行 POST 请求时,它失败了,说明:

"goal": ["This field is required."]

所以这很有趣。它从后端工作,但不是前端。

这是我的附加帮助代码:

//the ajax request 
    $.ajax(
        // obviates need for sameOrigin test
        crossDomain: false, 

        //adds a CSRF header to the request if the method is unsafe (the csrfSafeMethod is in base.html)
        beforeSend: function(xhr, settings) 
            if (!csrfSafeMethod(settings.type)) 
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            
        ,

        //needed because we're setting data, I think.
        type: "POST",

        //target API url 
        url: '/api/goal-status/add', 

        data: this_instead,

        //on success, reload the page, because everything worked
        success: function()
            location.reload();                            
alert("In the goal-add click listener");
        ,

        //we'll have to find something better to do when an error occurs. I'm still thinking through this. There will probably just have to be some standardized way of going about it. 
        error: function()
            alert('An error ocurred!'); 
        
    );

这是响应请求的视图:

class AddGoalStatus(generics.CreateAPIView): 
serializer_class = GoalStatusSerializer
permission_classes = (
    permissions.IsAuthenticated, 
)

以及对应的型号:

class Goal(TimeStampedModel): 
    """A personalized Goal that a user creates to achieve"""
    completed = models.BooleanField(default=False)
    user = models.ForeignKey(User)
    competencies = models.ManyToManyField(CoreCompetency)

    def __unicode__(self):
         return self.user.get_full_name()

class GoalStatus(TimeStampedModel):
    """As goals go on, users will set different statuses towards them"""
    content = models.TextField(max_length=2000)
    goal = models.ForeignKey(Goal, related_name="goal_statuses")

    def __unicode__(self):
        return self.goal.user.get_full_name() + ": " + self.content

    class Meta:
        verbose_name_plural = "Statuses"
    verbose_name = "Goal Status"

为了完整起见,这里是序列化程序:

class GoalSerializer(serializers.ModelSerializer): 
    competencies = serializers.PrimaryKeyRelatedField(many=True, read_only=False)
    class Meta: 
        model = Goal

class GoalStatusSerializer(serializers.ModelSerializer):
    goal = GoalSerializer()
    class Meta: 
        model = GoalStatus

【问题讨论】:

【参考方案1】:

正如汤姆克里斯蒂在这里所说:

django rest framework create nested objects "Models" by POST

Django Rest Framework 不允许您写入嵌套的序列化程序。

看起来有工作正在构建这个功能,但我不知道它是否已经完成:

https://github.com/tomchristie/django-rest-framework/tree/writable-nested-modelserializer

与此同时,请参阅此主题以了解如何解决此限制的想法:

https://groups.google.com/forum/#!topic/django-rest-framework/L-TknBDFzTk

【讨论】:

以上是关于Django-Rest-Framework POST 对象字段必填的主要内容,如果未能解决你的问题,请参考以下文章

断言错误:Django-rest-Framework

记录对 django-rest-framework 的请求

django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化器

django-rest-framework 按日期过滤=无

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

如何在 django-rest-framework 中为 API 使用 TokenAuthentication