Как сохранить несколько объектов в одном запросе POST - PullRequest
0 голосов
/ 03 апреля 2020

Я новичок в DRF. Я сохраняю данные о пользователе и его питомцах.

Вот модель

class Users(models.Model):
    id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=255, blank=True)
    last_name = models.CharField(max_length=255, blank=True)
    job = models.CharField(max_length=255, blank=True)
    age = models.CharField(max_length=255, blank=True)

class PetDetails(models.Model):
    user = models.ForeignKey(
        Users, on_delete=models.CASCADE, blank=True, null=True)
    pet_name = models.CharField(max_length=255, blank=True)
    pet_color = models.CharField(max_length=255, blank=True)
    pet_category = models.CharField(max_length=255, blank=True)

В этом мне нужно сохранить как пользователя, так и его питомцев в один запрос Post.

Итак, я создал такой сериализатор

class UserCreateSerializer(ModelSerializer):

    pet = PetDetailCreateSerializer(many=True)

    class Meta:
        model = Users
        fields = ['first_name','last_name','job','age', 'pet']

    def create(self, validated_data):
        pets_data = validated_data.pop('pet')
        user_obj = Users.objects.create(**validated_data)
        for pet in pets_data:
            PetDetails.objects.create(user=user_obj, **pet)
        return user_obj

Проблема, с которой я сталкиваюсь, заключается в том, что один человек может иметь несколько домашних животных.

Например, Джон является пользователем и у него есть два питомца.

Так что в этом случае будет создан объект двух пользователей. Как решить это

ИЛИ есть ли другие методы для обработки этого

Мои представления

class UserCreateView (CreateAPIView):
    serializer_class = UserCreateSerializer

1 Ответ

2 голосов
/ 03 апреля 2020

Один из способов - проверить, существует ли уже пользователь, используя get_or_create :

user_obj = Users.objects.get_or_create(**audit_data)

Но лучше, я думаю, создать пользователя с несколькими домашними животными вместо этого:

class UserCreateSerializer(ModelSerializer):

    petdetails_set = PetDetailCreateSerializer(many=True)

    class Meta:
        model = Users
        fields = ['first_name','last_name','job','age', 'petdetails_set']

    def create(self, validated_data):
        pets_data = validated_data.pop('pet')
        user_obj = User.objects.create(**validated_data)
        for pet in pets_data:
            PetDetails.objects.create(user=user_obj, **pet)
        return user_obj

Кроме того, я советую использовать отдельные конечные точки / сериализаторы для создания пользователей.

...