假设我有:
# models.py
class Project(models.Model):
project = models.CharField(max_length=200)
subproject = models.CharField(max_length=200)
physical_pct = models.FloatField()
cost = models.FloatField()
# serializers.py
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = '__all__'
在我的视图集中,我希望按名称显示一个按对象分组的对象,稍后将对其进行注释。我从值中引用了这个示例。
# views.py
class ProjectsViewSet(viewsets.ModelViewSet):
serializer_class = ProjectSerializer
def get_queryset(self):
queryset = Project.objects.values('project')
print(queryset)
return queryset
当我打印queryset
时,它会显示一个没有终端中其他字段的所有项目的列表。但是,它会引发一个错误:
"Got KeyError when attempting to get a value for field `subproject` on serializer `ProjectSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'subproject'."
我想要的输出是一个按project
字段分组的json。
更新1:
如果我将所有字段都放入values()
参数中,则不会出现错误。
.values('project', 'subproject', 'physical_pct', 'cost',)
现在它破坏了按值分组的目的。
发布于 2019-09-04 01:09:51
问题的主要原因是您的serializer
定义。如果您只想返回project
字段响应,请确保为此使用了适当的序列化程序。
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = '__all__' // this means you are suppose to pass all model fields
为此,我们需要自定义序列化程序。
class ProjectListSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ('project',)
此外,我们还需要根据需要更新get_serializer方法。
# views.py
class ProjectsViewSet(viewsets.ModelViewSet):
def get_queryset(self):
// If you are doing so you are suppose to have only one 'project' field response
queryset = Project.objects.values('project')
return queryset
def get_serializer_class(self):
if self.action == 'list' or self.action == 'retrive':
return ProjectListSerializer
return ProjectSerializer
发布于 2019-09-03 22:15:44
尝试:
queryset = Project.objects.all().values('project')
发布于 2019-09-03 22:43:16
您只查询项目模型中的项目字段,但试图序列化项目模型中的所有字段。如果要序列化一个字段,则不需要序列化程序:
class ProjectsViewSet(viewsets.ModelViewSet):
serializer_class = ProjectSerializer
queryset = Project.objects.all()
def list(self, request, *args, **kwargs):
qs = self.get_queryset().values_list('project', flat=True)
return Response(qs)
https://stackoverflow.com/questions/57782049
复制