Как получить или создать на Django Rest Framework и вернуть его

Я хочу отправить запрос post с данными json, как показано ниже.

{
  "checkin_date": "2022-02-15",
  "checkout_date": "2022-02-18",
  "guest_number": 1,
  "user": {
    "first_name": "Huesped",
    "last_name": "1",
    "email": "huesped_1@mail.com",
    "phone": "+34 12345678"
  }
}

Как я могу переопределить некоторый метод ModelSerializer, чтобы получить пользователя, если email существует, или создать его и вернуть его id для резервирования?

Можно ли это сделать в одном запросе с вложенными объектами или нужно сделать 2 запроса?

Вот мои файлы python.

models.py:

class Reservation(models.Model):
  user = models.ForeignKey(get_user_model(), verbose_name="User", related_name='user_reservations', on_delete=models.CASCADE)

serializers.py:

class ReservationPostSerializer(serializers.ModelSerializer):
  user = UserPostSerializer()

Заранее спасибо.

Сериализаторы DDRF не обрабатывают вложенные сериализаторы, поэтому ими нужно управлять вручную. В случае создания нового экземпляра модели вы можете переопределить функцию сериализатора .create() и выполнить создание вручную.

Для моделей django существует .get_or_create(), который вы можете использовать для создания нового пользователя, если он не существует.

# serializers.py

from django.db import transaction

class UserSerializer(serializers.SeralizerMethodField):
    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'email', 'phone']

class UserPostSerializer(serializers.ModelSerializer):
    checkin_date = serializers.DateField(format="%Y-%m-%d")
    checkout_date = serializers.DateField(format="%Y-%m-%d")
    guest_number = serializers.IntegerField(min_value=0)
    user = UserSerializer()

    class Meta:
        model = UserPost
        fields = ['checkin_date', 'checkout_date', 'guest_number', 'user']

    @transaction.atomic
    def create(self, validated_data):
        user_data = validated_data.pop('user', {})
        user_email = user_data.pop('email', '')

        user, created = User.objects.get_or_create(email=user_email, defaults=user_data)

        validated_data['user_id'] = user.id
        return super().create(validated_data)

Код выше просто основан на ожидаемых данных json ответа.

Вернуться на верх