DRF - Как правильно обновить ключ Foreing - PullRequest
0 голосов
/ 10 июля 2019

У меня проблемы с обновлением моего объекта User, так как мой запрос отправляет «идентификатор клиента» (пример: 12), но мой сериализатор y ожидает диктовку

Чтобы быть более понятным, вот сообщение, которое яполучить: Неверные данные.Ожидал словарь, но получил int.

Я пытаюсь зарегистрироваться, чтобы обновить поле моего клиента от моего пользователя, который является ForeingKey

, вот мой просмотр.py:

def update(self, request, *args, **kwargs):
    try:
        customer = BankCustomer.objects.filter(id=request.data.get('customer'))
        serializer = UserSerializer(customer, data=request.data)
    except BankCustomer.DoesNotExist:
        return Response(None, status=status.HTTP_400_BAD_REQUEST)
    if serializer.is_valid():
        serializer.save()
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    return Response(serializer.data, status=status.HTTP_200_OK)

user serializers.py:

class UserSerializer(serializers.ModelSerializer):
    customer = BankCustomerSerializer()
    email = serializers.EmailField()

    class Meta:
        model = User
        fields = ('id', 'email', 'name', 'lastname', 'type', 'customer', 'is_blocked')


    def update(self, instance, validated_data):
        instance.customer = validated_data.get("customer", instance.customer)
        instance.email = validated_data.get("title", instance.email)
        instance.name = validated_data.get("name", instance.name)
        instance.lastname = validated_data.get("lastname", instance.lastname)

        return instance

сериализатор клиента:

class BankCustomerSerializer(serializers.ModelSerializer):
    users = serializers.PrimaryKeyRelatedField(many=True, source='customer_r', queryset=User.objects.all(), default='')

    class Meta:
        model = BankCustomer
        fields = ('id', 'customer', 'ruc', 'address', 'phone', 'users')

1 Ответ

0 голосов
/ 11 июля 2019

Если я не ошибаюсь, вы хотите отправить только поле идентификатора клиента для обновления, но вы хотите получить в ответ весь экземпляр Customer.

Один из способов сделать это - использовать сериализаторы RelatedField следующим образом:

class CustomerListingField(serializers.RelatedField):

    def to_representation(self, instance):
        return instance

    def to_internal_value(self, data):
        return Customer.objects.get(id=data)

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

Затем в UserSerializer замените:

customer = BankCustomerSerializer()

с этим:

customer = CustomerListingField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...