我是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
答案 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
此外,我建议使用单独的终结点/序列化器来创建用户。