【问题标题】:Django Rest Framework :How to serialize many to many fieldDjango Rest Framework:如何序列化多对多字段
【发布时间】:2022-01-18 02:31:11
【问题描述】:

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

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:尝试在序列化程序CertificatesSerializer 上获取字段description 的值时出现AttributeError。 序列化程序字段可能命名不正确,并且与 ManyRelatedManager 实例上的任何属性或键都不匹配。 原始异常文本是:“ManyRelatedManager”对象没有属性“描述”。

【问题讨论】:

    标签: python-3.x django django-models serialization django-rest-framework


    【解决方案1】:

    您忘记在certificates = CertificatesSerializer() 中设置many=True

    正确版本:

    class SuppliersSerializer(serializers.ModelSerializer):
        certificates = CertificatesSerializer(many=True)
    
        class Meta:
            model = Suppliers
            fields = ('id', 'name', 'certificates')
    

    DRF 认为这是一对一的关系,而不是一对多的关系

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2021-06-12
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多