无法更新具有多对一关系的两个模型的嵌套序列化程序
cant update a nested serializer of two model with many to one relation
我创建了两个名为 office 和 phone 的模型,phone 保存了 office phones(每个 office 可以有多个 phone 号码)用于使用这两个模型我创建了一个嵌套序列化器和两个通用视图,一个用于 post 并获取请求,另一个用于放置删除和检索我在 post ,获取,删除,检索中没有问题但是在更新方法无法更新 phone 个数字的情况
这是代码:
办公室模特和phone模特:
class Office(models.Model):
doctor=models.ForeignKey(Doctor,on_delete=models.CASCADE)
title=models.CharField(max_length=100)
address=models.TextField()
location=models.FloatField()
def __str__(self):
return f"{self.title}({self.id})"
class OfficePhone(models.Model):
office=models.ForeignKey(Office,related_name='phone',on_delete=models.CASCADE)
phone=models.TextField()
phone 和 office 序列化程序:
class OfficeSerialzier(serializers.ModelSerializer):
phone = OfficePhoneSerializer(many=True)
def create(self, validated_data):
phones = validated_data.pop('phone')
office = Office.objects.create(**validated_data)
for data in phones:
p = OfficePhone(phone=data['phone'], office=office)
p.save()
return office
def update(self, instance, validated_data):
phone_numbers=validated_data.pop('phone')
return super().update(instance, validated_data)
class Meta():
model = Office
fields = ['id', 'doctor', 'title', 'address', 'location', 'phone']
lookup_field = 'doctor'
office 泛型视图:
class OfficeDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class=OfficeSerialzier
queryset=Office.objects.all()
class officeListByDoctorID(generics.ListAPIView):
serializer_class = OfficeSerialzier
def get_queryset(self):
return Office.objects.filter(doctor=self.kwargs['doctor'])
和 api 当我请求 put 方法无法在序列化程序中获取 phones 的 id 时,就像下面这样:
{
"id": 25,
"doctor": 2,
"title": "new title updated",
"address": "تهران",
"location": 454454.0,
"phone": [
{
"id": 33,
"phone": "+914221036"
},
{
"id": 34,
"phone": "+9144562528"
},
{
"id": 35,
"phone": "+9144562528"
}
]
}
每次我删除每个phone个办公室号码并重新编写时更新
class OfficeSerialzier(serializers.ModelSerializer):
phone = OfficePhoneSerializer(many=True)
def create(self, validated_data):
phones = validated_data.pop('phone')
office = Office.objects.create(**validated_data)
for data in phones:
p = OfficePhone(phone=data['phone'], office=office)
p.save()
return office
def update(self, instance, validated_data):
phone_numbers= validated_data.pop('phone')
OfficePhone.objects.filter(office=instance.id).delete()
for data in phone_numbers:
OfficePhone.objects.create(office=instance,phone=data.get('phone'))
return super().update(instance, validated_data)
class Meta():
model = Office
fields = ['id', 'doctor', 'title', 'address', 'location', 'phone']
lookup_field = 'doctor'
我创建了两个名为 office 和 phone 的模型,phone 保存了 office phones(每个 office 可以有多个 phone 号码)用于使用这两个模型我创建了一个嵌套序列化器和两个通用视图,一个用于 post 并获取请求,另一个用于放置删除和检索我在 post ,获取,删除,检索中没有问题但是在更新方法无法更新 phone 个数字的情况 这是代码:
办公室模特和phone模特:
class Office(models.Model):
doctor=models.ForeignKey(Doctor,on_delete=models.CASCADE)
title=models.CharField(max_length=100)
address=models.TextField()
location=models.FloatField()
def __str__(self):
return f"{self.title}({self.id})"
class OfficePhone(models.Model):
office=models.ForeignKey(Office,related_name='phone',on_delete=models.CASCADE)
phone=models.TextField()
phone 和 office 序列化程序:
class OfficeSerialzier(serializers.ModelSerializer):
phone = OfficePhoneSerializer(many=True)
def create(self, validated_data):
phones = validated_data.pop('phone')
office = Office.objects.create(**validated_data)
for data in phones:
p = OfficePhone(phone=data['phone'], office=office)
p.save()
return office
def update(self, instance, validated_data):
phone_numbers=validated_data.pop('phone')
return super().update(instance, validated_data)
class Meta():
model = Office
fields = ['id', 'doctor', 'title', 'address', 'location', 'phone']
lookup_field = 'doctor'
office 泛型视图:
class OfficeDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class=OfficeSerialzier
queryset=Office.objects.all()
class officeListByDoctorID(generics.ListAPIView):
serializer_class = OfficeSerialzier
def get_queryset(self):
return Office.objects.filter(doctor=self.kwargs['doctor'])
和 api 当我请求 put 方法无法在序列化程序中获取 phones 的 id 时,就像下面这样:
{
"id": 25,
"doctor": 2,
"title": "new title updated",
"address": "تهران",
"location": 454454.0,
"phone": [
{
"id": 33,
"phone": "+914221036"
},
{
"id": 34,
"phone": "+9144562528"
},
{
"id": 35,
"phone": "+9144562528"
}
]
}
每次我删除每个phone个办公室号码并重新编写时更新
class OfficeSerialzier(serializers.ModelSerializer):
phone = OfficePhoneSerializer(many=True)
def create(self, validated_data):
phones = validated_data.pop('phone')
office = Office.objects.create(**validated_data)
for data in phones:
p = OfficePhone(phone=data['phone'], office=office)
p.save()
return office
def update(self, instance, validated_data):
phone_numbers= validated_data.pop('phone')
OfficePhone.objects.filter(office=instance.id).delete()
for data in phone_numbers:
OfficePhone.objects.create(office=instance,phone=data.get('phone'))
return super().update(instance, validated_data)
class Meta():
model = Office
fields = ['id', 'doctor', 'title', 'address', 'location', 'phone']
lookup_field = 'doctor'