Django Rest Framework Many=False 产生错误
Django Rest Framework Many=False producing errors
我坚持尝试使用 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" 时产生此错误:
Got AttributeError when attempting to get a value for field label
on
serializer DataPointSerializer
. The serializer field might be named
incorrectly and not match any attribute or key on the RelatedManager
instance. Original exception text was: 'RelatedManager' object has no
attribute 'label'.
因为这只是一个模型对象(一对多关系),我想将结果作为单个对象与一个对象的列表进行比较。
我这样做对吗?我认为转动 "many=False" 它将获取嵌套查询中的第一条记录。
如有任何见解,我们将不胜感激。
您不能设置 many=False
,因为 dataPoints
是一个相关字段,returns 一个包含实例列表的查询集,而不仅仅是一个实例。
当你DataPointModel.dataPoints
returns 一个查询集时,它不能 returns 只是一个实例。所以设置many=False
,它不会得到列表的第一个元素。
所以我得出的解决方案是用附加外键的位置重构我的模型。
这是我实施的修复:
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 会自动加入数据模型。
如下所示编写您的 DataPointModel。然后它应该可以工作
class DataPointModel(models.Model):
dataSet = models.OneToOneField(DataSetModel, related_name='dataPoints')
label = models.CharField(max_length=200)
我坚持尝试使用 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" 时产生此错误:
Got AttributeError when attempting to get a value for field
label
on serializerDataPointSerializer
. The serializer field might be named incorrectly and not match any attribute or key on theRelatedManager
instance. Original exception text was: 'RelatedManager' object has no attribute 'label'.
因为这只是一个模型对象(一对多关系),我想将结果作为单个对象与一个对象的列表进行比较。
我这样做对吗?我认为转动 "many=False" 它将获取嵌套查询中的第一条记录。
如有任何见解,我们将不胜感激。
您不能设置 many=False
,因为 dataPoints
是一个相关字段,returns 一个包含实例列表的查询集,而不仅仅是一个实例。
当你DataPointModel.dataPoints
returns 一个查询集时,它不能 returns 只是一个实例。所以设置many=False
,它不会得到列表的第一个元素。
所以我得出的解决方案是用附加外键的位置重构我的模型。
这是我实施的修复:
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 会自动加入数据模型。
如下所示编写您的 DataPointModel。然后它应该可以工作
class DataPointModel(models.Model):
dataSet = models.OneToOneField(DataSetModel, related_name='dataPoints')
label = models.CharField(max_length=200)