我一直试图使用django-rest-framework解决Serializers和相关字段的问题。目前我的模型看起来像这样:
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'对象没有 属性'标签'。
由于这只是一个模型对象(一对多关系),我希望将结果作为单个对象与一个对象的列表进行比较。
我这样做是对的吗?我认为转动"很多=错误"它会在嵌套查询中获取第一条记录。
非常感谢任何见解。
答案 0 :(得分:1)
所以解决的问题是重构我的模型,并附上外键。
以下是我实施的修复:
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)
如果设置“多个=错误”,则将其移动到DataSetModel会自动加入数据模型。在Serializer对象中。
答案 1 :(得分:0)
您无法设置many=False
,因为dataPoints
是一个相关字段,它返回一个包含实例列表的查询集,而不仅仅是一个实例。
当你执行返回查询集的DataPointModel.dataPoints
时,它不能只返回一个实例。因此设置many=False
,它不会获得列表的第一个元素。