2016-03-04 3 views
3

модели:основа Остальное Джанго обратные данные отношение поля опущенные из validated_data

class Questionnaire(models.Model): 
    ... 

class Question(models.Model): 
    ... 
    questionnaire = models.ForeignKey('Questionnaire', related_name='questions', blank=True, null=True) 
    ... 

сериализаторы:

class QuestionSerializer(serializers.ModelSerializer): 
    choices = MultipleChoiceSerializer(many=True) 
    children = RecursiveField(many=True) 

    class Meta: 
     model = Question 
     fields = [ 
      'id', 
      'text', 
      'order', 
      'choices', 
      #'parent', 
      'children', 
      'type', 
      'category', 
      'requiredif', 
      'max_answers', 
      'min_answers', 
     ] 

class QuestionnaireCreateUpdateSerializer(serializers.ModelSerializer): 
    questions = QuestionSerializer(many=True) 

    class Meta: 
     model = Questionnaire 
     fields = [ 
      'id', 
      'questions', 
      'name', 
      'description', 
     ] 

     def create(self, validated_data): 
      print validated_data 
      ... 

validated_data использованием {'name': 'a', 'description': 'b', 'questions': [{'category': 'a', 'min_answers': 1}]}:

{u'name': u'a', u'questions': [], u'description': u'b'} 

простой тест:

def test_submit_qnr(self): 
     self.client.force_login(self.user.user) 
     qnr2 = {'name': 'a', 'description': 'b', 'questions': [{'category': 'a', 'min_answers': 1}]} 
     response = self.client.post('/api/qnr/', data=qnr2) 
     print response.json() 
     response.json()['questions'].should_not.equal([]) # fails! 

JSON ответ:

{u'description': u'b', u'id': 1, u'questions': [], u'name': u'a'} 

Я хотел бы написать вложенные поля и переопределены create сделать это, но, как представляется, проблема с проверкой, в том, что данные для вложенных моделей удаляемых в validated_data. Я попытался напечатать переменную validated_data в верхней части функции create, и по причинам, которые я не понимаю, поле questions - пустой список. В разделе отношений в документации api-guide показан почти этот точный пример. Что мне не хватает?

EDIT1:

сериализатора работает, как ожидалось при испытании непосредственно в оболочке, но по какой-то причине он не в тесте

EDIT 2: Вид:

class QuestionnaireViewSet(viewsets.ModelViewSet): 
    authentication_classes = [SessionAuthentication, BasicAuthentication, JSONWebTokenAuthentication] 
    permission_classes = [permissions.IsAuthenticated, ] 
    queryset = Questionnaire.objects.all() 
    serializer_class = QuestionnaireCreateUpdateSerializer 

URL-адреса :

router = routers.DefaultRouter() 
router.register(r'qnr', QuestionnaireViewSet) 

urlpatterns = [ 
    ... 
    url(r'^api/', include(router.urls)), 
    ] 
+0

Можете ли вы также добавить 'QuestionSerializer'? – AKS

+0

@AKS добавили сериализатор –

+1

Все выглядит хорошо. Вы пытались сделать это на консоли, как показано в api-guide [example] (http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers)? – AKS

ответ

2

Поскольку вы следовали примеру prov Я думаю, что данные не отправляются должным образом.

Джанго Rest Framework использует APIClient для тестирования, который основан на Джанго Test Client

Если вы не обеспечивают content type значение по умолчанию multipart/form-data

If you don’t provide a value for content_type , the values in data will be transmitted with a content type of multipart/form-data . In this case, the key-value pairs in data will be encoded as a multipart message and used to create the POST data payload.

Вам нужно будет явно указать format из данные как json:

response = self.client.post('/api/qnr/', data=qnr2, format='json') 
Смежные вопросы