如何在单个POST请求中保存多个对象

时间:2020-04-03 06:22:35

标签: django django-models django-rest-framework django-views

我是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 个答案:

答案 0 :(得分:2)

一种方法是使用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

此外,我建议使用单独的终结点/序列化器来创建用户。