Django Rest Framework:如何序列化多对多字段

问题描述 投票:0回答:2

我有我的模型证书和供应商,供应商与证书有多对多的关系

class Certificates(models.Model):
        name = models.CharField(max_length=500, null=False)
        description = models.CharField(max_length=500, null=False)
        image_url = models.CharField(max_length=500, null=False)
    
        def __str__(self):
            return f'{self.name}'
    
    
    class Suppliers(models.Model):
        name = models.CharField(max_length=500, null=False)
        location = models.CharField(max_length=500, null=False)
        longitude = models.CharField(max_length=500, null=True)
        latitude = models.CharField(max_length=500, null=True)
        certificates = models.ManyToManyField(Certificates, null=True)
        bio = RichTextField(blank=True, null=True)
        environmental_info = RichTextField(blank=True, null=True)
        social_info = RichTextField(blank=True, null=True)
        governance_info = RichTextField(blank=True, null=True)

        def __str__(self):
            return f'{self.name}'

这是我的序列化器:

class CertificatesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Certificates
        fields = '__all__'


class SuppliersSerializer(serializers.ModelSerializer):
    certificates = CertificatesSerializer()

    class Meta:
        model = Suppliers
        fields = ('id', 'name', 'certificates')

这是我的观点

@api_view(['GET'])
def supplier_response_list(request):
    suppliers_list = Suppliers.objects.all()
    serializer = SuppliersSerializer(suppliers_list, many=True)
    return Response(serializer.data)

收到此错误: AttributeError:尝试在序列化器

description
上获取字段
CertificatesSerializer
的值时出现 AttributeError。 序列化器字段可能命名不正确,并且与
ManyRelatedManager
实例上的任何属性或键不匹配。 原始异常文本是:“ManyRelatedManager”对象没有属性“description”。

python-3.x django django-models serialization django-rest-framework
2个回答
2
投票

您忘记在

many=True
 中设置 
certificates = CertificatesSerializer()

正确版本:

class SuppliersSerializer(serializers.ModelSerializer):
    certificates = CertificatesSerializer(many=True)

    class Meta:
        model = Suppliers
        fields = ('id', 'name', 'certificates')

如果没有 DRF 认为这是一对一关系而不是一对多


0
投票

像@sharpek评论一样在

many=True
中设置
certificates = CertificatesSerializer()

请注意,在迁移和存储数据时,

null=True
中的
ManyToManyField
会被忽略

在这种情况下应该使用

blank=True
来表示
m2m
关系,而不是可空数据插入

© www.soinside.com 2019 - 2024. All rights reserved.