需要Django-Rest-Framework POST对象字段

时间:2013-11-01 15:04:29

标签: python ajax django api rest

我正在使用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 个答案:

答案 0 :(得分: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