Django Rest Framework Mongoengine - PUT / PATCH против GET для ReferenceField - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть два документа mongoengine модели как:

from mongoengine import *

class Doc1(Document):
  doc1_field1 = StringField(max_length=100)
  doc1_field2 = StringField(max_length=100)

class Doc2(Document):
  doc2_field1 = ReferenceField(Doc1)
  doc2_field2 = StringField(max_length=100)

in serializers.py :

from rest_framework_mongoengine import serializers
from .models import Doc1, Doc2

class Doc1Serializer(serializers.DocumentSerializer):

   class Meta:          
      model = Doc1
      fields = '__all__'

class Doc2Serializer(serializers.DocumentSerializer):

   doc2_field1 = Doc1Serializer()

   class Meta:
      model = Doc2
      fields = ('doc2_field1', 'doc2_field2')

views.py

from rest_framework_mongoengine import viewsets
from .models import Doc2
from .serializers import Doc2Serializer

class Doc2ViewSet(viewsets.ModelViewSet):

   lookup_field = 'pk'

   serializer_class = Doc2Serializer

   def get_queryset(self):
     return Doc2.objects.all()

То, чего я пытаюсь достичь, это когда я делаю GET запрос, doc2_field1 должен быть разыменован на основе Doc1Serializer, и это это на самом деле так прямо сейчас. Проблема в том, что я пытаюсь PUT / PATCH doc2_field1 с новой ссылкой ObjectID, как определено в models.py. Вот где я получаю следующее:

"non_field_errors": [ "Неверные данные. Ожидается словарь, но есть ул." ]

Таким образом, мой вопрос, есть ли способ получить разыменованное поле в GET, но разрешить ссылки на объекты в PUT/PATCH.

ОЖИДАЕТСЯ:

GET:

{
  "doc2_field1": {
  "doc1_field1": "Text Value 1",
  "doc1_field2": "Text Value 2"
  },
  "doc2_field2": "Text Value"
}

PUT / PATCH:

{
  "doc2_field1": "5ae1a104e35e8620801798f3"
  "doc2_field2": "Text Value"
}

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете переопределить метод to_representation Doc2Serializer, чтобы показывать детали только для запросов GET:

class Doc2Serializer(serializers.DocumentSerializer):

   class Meta:
      model = Doc2
      fields = ('doc2_field1', 'doc2_field2')

   def to_representation(self, instance):
      self.fields['doc2_field1'] = Doc1Serializer()
      return super(Doc2Serializer, self).to_representation(instance)
...