модели:основа Остальное Джанго обратные данные отношение поля опущенные из 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)),
]
Можете ли вы также добавить 'QuestionSerializer'? – AKS
@AKS добавили сериализатор –
Все выглядит хорошо. Вы пытались сделать это на консоли, как показано в api-guide [example] (http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers)? – AKS