2013-11-01 71 views
1

我正在使用djangorestframework(我喜欢),我试图从前端将一些数据发布到等待接受它的REST视图/序列化程序。Django-Rest-Framework POST对象字段必需

当我登录到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框架不允许你写一个嵌套的序列化。

它看起来像有打造出这个功能正在做的工作,但如果没有完成,我不知道:

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

同时看到这个线程的想法如何解决此限制:

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

相关问题