2013-11-01 7 views
1

Я использую djangorestframework (что мне нравится), и я пытаюсь выполнить POST некоторые данные с переднего конца в REST view/serializer, ожидающие его принятия.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

Джанго Rest Framework не позволяет писать вложенный сериализатор.

Похоже, что работа делается на создании эту функциональность, но я не знаю, если это будет сделано еще:

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

В то же время видеть эту нить идеи о том, как работают вокруг этого ограничения:

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

Смежные вопросы