序列化程序在 Django 3.1 中删除一对多关系
Serializer removing one to many relationship in Django 3.1
当我尝试将照片附加到宠物时,序列化程序正在删除附件,我得到 attachment :['This field is required']
。我的代码:
models.py
class Pet(models.Model):
pet_id = models.UUIDField('pet uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
name = models.CharField('Pet name', max_length=255, null=False, blank=False)
class Attachment(models.Model):
attachment_id = models.UUIDField('attachment uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
pet_id = models.ForeignKey(Pet, on_delete=models.CASCADE)
name = models.FileField(upload_to='photos/', null=False, blank=False)
upload_at = models.DateTimeField('Time it was uploaded', max_length=50, null=False, blank=False )
serializers.py
class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = Attachment
fields = ('name','upload_at')
class PetSerializer(serializers.ModelSerializer):
attachment = AttachmentSerializer(source='attachment_set', many=True)
class Meta:
model = Pet
fields = ('pet_id','name', 'attachment')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet
views.py
def create_pet(self, request):
serializer = self.get_serializer(data=request.data)
if not serializer.is_valid():
return Response({'error':serializer.errors,status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response({'data':serializer.validated_data}, status=status.HTTP_201_CREATED)
如果 PetSerializer
我会 attachment = AttachmentSerializer(many=True, source='attachment_set', required=False)
附件没有问题,但我需要附件。
我也在models.py上做了Attachment
pet_id = models.ForeignKey(Pet, related_name='attachments', on_delete=models.CASCADE)
和序列化器 PetSerializer
:
class PetSerializer(serializers.ModelSerializer):
class Meta:
model = Pet
fields = ('pet_id','name', 'attachments')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet
但我得到了同样的错误。
另外我检查了request.data
的内容,附件在里面。
对此有什么想法吗?提前致谢
解决方案是,在序列化程序上将此 attachment = AttachmentSerializer(source='attachment_set', many=True)
更改为 attachment = serializers.ListField(child=AttachmentSerializer(many=True))
并添加创建方法 attachments = attachments[0]
。更新代码:
class PetSerializer(serializers.ModelSerializer):
attachment = serializers.ListField(child=AttachmentSerializer(many=True))
class Meta:
model = Pet
fields = ('pet_id','name', 'attachment')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
attachments = attachments[0] # Extract the list inside the list
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet
当我尝试将照片附加到宠物时,序列化程序正在删除附件,我得到 attachment :['This field is required']
。我的代码:
models.py
class Pet(models.Model):
pet_id = models.UUIDField('pet uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
name = models.CharField('Pet name', max_length=255, null=False, blank=False)
class Attachment(models.Model):
attachment_id = models.UUIDField('attachment uid',default=uuid.uuid4,null=False,primary_key=True,blank=False,editable=False, unique=True)
pet_id = models.ForeignKey(Pet, on_delete=models.CASCADE)
name = models.FileField(upload_to='photos/', null=False, blank=False)
upload_at = models.DateTimeField('Time it was uploaded', max_length=50, null=False, blank=False )
serializers.py
class AttachmentSerializer(serializers.ModelSerializer):
class Meta:
model = Attachment
fields = ('name','upload_at')
class PetSerializer(serializers.ModelSerializer):
attachment = AttachmentSerializer(source='attachment_set', many=True)
class Meta:
model = Pet
fields = ('pet_id','name', 'attachment')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet
views.py
def create_pet(self, request):
serializer = self.get_serializer(data=request.data)
if not serializer.is_valid():
return Response({'error':serializer.errors,status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response({'data':serializer.validated_data}, status=status.HTTP_201_CREATED)
如果 PetSerializer
我会 attachment = AttachmentSerializer(many=True, source='attachment_set', required=False)
附件没有问题,但我需要附件。
我也在models.py上做了Attachment
pet_id = models.ForeignKey(Pet, related_name='attachments', on_delete=models.CASCADE)
和序列化器 PetSerializer
:
class PetSerializer(serializers.ModelSerializer):
class Meta:
model = Pet
fields = ('pet_id','name', 'attachments')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet
但我得到了同样的错误。
另外我检查了request.data
的内容,附件在里面。
对此有什么想法吗?提前致谢
解决方案是,在序列化程序上将此 attachment = AttachmentSerializer(source='attachment_set', many=True)
更改为 attachment = serializers.ListField(child=AttachmentSerializer(many=True))
并添加创建方法 attachments = attachments[0]
。更新代码:
class PetSerializer(serializers.ModelSerializer):
attachment = serializers.ListField(child=AttachmentSerializer(many=True))
class Meta:
model = Pet
fields = ('pet_id','name', 'attachment')
# because this:
# https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers
def create(self, validated_data):
attachments = validated_data.pop('attachment')
pet = Pet.objects.create(**validated_data)
attachments = attachments[0] # Extract the list inside the list
for att in attachments:
Attachment.objects.create(pet_id=pet.pet_id, **att)
return pet