2016-11-11 2 views
3

Я читаю на Django REST Framework, и у меня есть модель, которая сериализована с помощью геттеров с использованием SerializerMethodField().Django REST Serializer Method Writable Field

Однако, когда я отправляю POST на эту конечную точку, я также хочу установить это поле, но это не работает, потому что, как показано выше, вы не можете писать в SerializerMethodField. Есть ли способ в Django REST иметь поле сериализатора, для которого вы определяете пользовательский метод getter, и метод пользовательских меток?

EDIT: Вот источник того, что я пытаюсь сделать. Клиент имеет отношения 1 к 1 с пользователем.

class ClientSerializer(serializers.ModelSerializer): 
    email = serializers.SerializerMethodField() 

    def create(self, validated_data): 
     email = validated_data.get("email", None) # This doesn't work because email isn't passed into validated_data because it's a readonly field 
     # create the client and associated user here 


    def get_email(self, obj): 
     return obj.user.email 

    class Meta: 
     model = Client 
     fields = (
      "id", 
      "email", 
     ) 
+0

http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer –

+0

Да, это то, о чем я прошу. В нем говорится, что вы не можете действительно принимать данные в serializermethodfield в POST в одном из этих комментариев, но я спрашиваю, есть ли способ сделать это в Django REST, который, возможно, не использует serializermethodfield – Nick

+1

, вы должны опубликовать источник для использования метода сериализатора отдыха django rest. Почему бы просто не использовать нормальное поле сериализатора? Вы не можете использовать сериализатор методов для почтовых запросов, поскольку это поле только для чтения. – Dap

ответ

1

Вы должны использовать другой тип поля:

class ClientSerializer(serializers.ModelSerializer): 
    email = serializers.EmailField(source='user.email') 

    def create(self, validated_data): 
     # DRF will create object {"user": {"email": "inputed_value"}} in validated_date 
     email = validated_data.get("user", {}).get('email') 

    class Meta: 
     model = Client 
     fields = (
      "id", 
      "email", 
     ) 
0

Почему бы просто не создать клиента вместо этого?

def post(self, request, *args, **kwargs): 
    data = { 
     'email': request.data.get('email'), 
    } 

    serializer = ClientSerializer(data=data) 
    if serializer.is_valid(): 
     email = serializer.data.get('email') 
     client = Client.objects.create(email=email) 
     # do other stuff 
+1

Я определенно мог это сделать, но я надеялся, что уже есть способ обработать этот вариант использования в сериализаторе Django REST. Кажется странным отделить логику сериализации и полей от самого сериализатора – Nick

+0

Возможно ли переопределить метод post ViewSet? –

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