【问题标题】:Django Rest Framework Many=False producing errorsDjango Rest Framework Many=False 产生错误
【发布时间】:2015-05-15 10:39:34
【问题描述】:

我一直在尝试使用 django-rest-framework 解决序列化程序和相关字段的问题。目前我有一个看起来像这样的模型:

class DataSetModel(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()

class DataPointModel(models.Model):
    dataSet = models.ForeignKey(DataSetModel, related_name='dataPoints')
    label = models.CharField(max_length=200)

我的序列化器如下所示:

class DataPointSerializer(serializers.ModelSerializer):
    class Meta:
        model = DataPointModel
        fields = ('pk','label')

class DataSetSerializer(serializers.ModelSerializer):
    dataPoints = DataPointSerializer(many=True, read_only=True)

    class Meta:
        model = DataSetModel
        fields = ('pk','title')

我遇到的问题是当我尝试更改序列化程序中的“many=False”时会产生此错误:

尝试获取字段 label 的值时出现 AttributeError 序列化程序DataPointSerializer。序列化器字段可能被命名 不正确且不匹配 RelatedManager 上的任何属性或键 实例。原始异常文本是:“RelatedManager”对象没有 属性“标签”。

由于这只是一个模型对象(一对多关系),我希望将结果作为单个对象而不是一个对象的列表。

我这样做是否正确?我认为打开“many=False”会获取嵌套查询中的第一条记录。

任何见解将不胜感激。

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    如下编写您的 DataPointModel。它应该可以工作

    class DataPointModel(models.Model):
        dataSet = models.OneToOneField(DataSetModel, related_name='dataPoints')
        label = models.CharField(max_length=200)
    

    【讨论】:

      【解决方案2】:

      所以我找到的解决方案是使用附加外键的位置重构我的模型。

      这是我实施的修复:

      class DataSetModel(models.Model):
          title = models.CharField(max_length=200)
          description = models.TextField()
          dataPoint = models.ForeignKey(DataPointModel)
      
      class DataPointModel(models.Model):
          label = models.CharField(max_length=200)
      

      如果您在 Serializer 对象中设置了“many=False”,则将其移动到 DataSetModel 会自动加入数据模型。

      【讨论】:

        【解决方案3】:

        您不能设置many=False,因为dataPoints 是一个相关字段,它返回一个包含实例列表的查询集,而不仅仅是一个实例。

        当您执行返回查询集的DataPointModel.dataPoints 时,它不能只返回一个实例。所以设置many=False,它不会得到列表的第一个元素。

        【讨论】:

        • 列维,谢谢你的回答。您建议如何在我的模型设置中处理此问题?
        • @renderbox 为什么是你的意思?你想让我做什么 ?只渲染一个实例模型?
        • 我正在嵌套序列化模型,所以它只是对服务器的一次调用。关键是不必在客户端进行额外处理(处理列表)并使其交付准备好使用。
        猜你喜欢
        • 2021-09-20
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2016-09-09
        • 2015-06-18
        • 1970-01-01
        • 2019-11-22
        • 2015-02-13
        相关资源
        最近更新 更多