Как получить или создать на 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 ответа.