【问题标题】:Can't render nested relationship in Django Rest Framework无法在 Django Rest Framework 中呈现嵌套关系
【发布时间】:2021-01-10 21:11:38
【问题描述】:

问题是我有一个“详细信息”字段,它应该呈现与其父序列化程序的嵌套关系。我尝试了很多东西,但似乎没有任何效果。

这是我的模型:

class BusinessOrderModel(OrderToModel):
    reference = models.IntegerField()
    business_num = models.ForeignKey('BusinessModel', on_delete=models.CASCADE)
    def __str__(self):
        return str(self.reference)
    
class BusinessModel(models.Model):
    Business_num = models.IntegerField(primary_key=True)
    def __str__(self):
        return str(self.Business_num)

class DetailModel(models.Model):
    id = models.AutoField(primary_key=True)
    detail = models.TextField()
    order = models.ForeignKey('BusinessOrderModel', on_delete=models.CASCADE)

这是我的序列化程序不起作用:

class DetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = DetailModel
        fields = ('id', 'detail')

class BusinessOrderSerializer(serializers.ModelSerializer):
    details = DetailSerializer(many=True)
    class Meta:
        model = BusinessOrderModel
        fields = ('reference', 'business_num', 'details')

我尝试了很多不同的方法,但我得到了这个错误:

尝试获取字段 details 的值时出现 AttributeError 在序列化程序BusinessOrderSerializer 上。序列化器字段可能是 命名不正确且不匹配任何属性或键 BusinessOrderModel 实例。原始异常文本是: “BusinessOrderModel”对象没有“详细信息”属性。

非常感谢任何帮助。

非常感谢。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    使用details 查找反向关系仅在您将其设置为related_name 时才有效。 BusinessOrderModelDetailModel 的默认值为 detailmodel_set

    要通过调用details 使其可访问,您应该进行以下更改:

    class DetailModel(models.Model):
        id = models.AutoField(primary_key=True)
        detail = models.TextField()
        order = models.ForeignKey('BusinessOrderModel', related_name="details", on_delete=models.CASCADE)
    

    现在你可以使用DetailModel.objects.get(id=1).details.all()

    您还可以在序列化程序中自定义查询:

    class BusinessOrderSerializer(serializers.ModelSerializer):
        details = SerializerMethodField()
        class Meta:
            model = BusinessOrderModel
            fields = ('reference', 'business_num', 'details')
    
        def get_details(self, obj):
            return DetailSerializer(obj.details.filter(), many=True).data
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多