Python 如何在Viewset Django中选择“仅指定字段”

Python 如何在Viewset Django中选择“仅指定字段”,python,django,django-serializer,Python,Django,Django Serializer,我想从Django视图集中选择不同的字段和一些字段 我的方法 @action(methods=['get'], detail=False) def shiftsum(self, request): query = ( Shift.objects.values('shiftid', 'dayname') .annotate(shiftdesc=Max('shiftdesc

我想从Django视图集中选择不同的字段和一些字段

我的方法

@action(methods=['get'], detail=False)
    def shiftsum(self, request):        
        query = (
                    Shift.objects.values('shiftid', 'dayname')
                        .annotate(shiftdesc=Max('shiftdesc'))
                        .annotate(ct=Count('*'))  # get count of rows in group
                        .order_by('shiftid', 'dayname')
                        .distinct()
                )
        serializer = self.get_serializer_class()(query,many=True)
        return Response(serializer.data)
我的模型

class Shift(models.Model):
    shiftid = models.CharField(max_length=15)
    shiftdesc = models.CharField(blank = False, null= False, max_length=20)
    dayname = models.CharField(blank = False, null= False, max_length=20)
    dayno = models.IntegerField(blank = False, null= False)
    offin_f = models.IntegerField(blank = False, null= False)
    .
    .
    .
我的序列化程序

class ShiftSerializer(serializers.ModelSerializer):
    class Meta:        
        model=Shift
        fields = "__all__"

    def create(self,validated_data):      
        validated_data['Created_Usr']="Admin"             
        validated_data['Created_DT']=datetime.datetime.now()      
        validated_data['LastModified_Usr']=''            
        validated_data['LastModified_DT']=None            
        return Shift.objects.create(**validated_data)

    def update(self,instance,validated_data):       
        instance.shiftdesc = validated_data.get('shiftdesc',instance.shiftdesc) 
        instance.dayname = validated_data.get('dayname',instance.dayname) 
        instance.dayno = validated_data.get('dayno',instance.dayno) 
        instance.offin_f = validated_data.get('offin_f',instance.offin_f) 
        instance.offout_f = validated_data.get('offout_f',instance.offout_f) 
当我这样选择时,会显示错误消息

“尝试获取上的字段
dayno
的值时出现get-KeyError” 序列化程序
ShiftSerializer
\n序列化程序字段可能已命名 不正确且与
dict上的任何属性或键不匹配
实例。\n原始异常文本为:“dayno”


我只想选择
shiftid
shiftdesc
dayname
,如何只选择这三个字段,我是否需要创建新的序列化程序?

您的
ShiftSerializer
使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>这意味着它将尝试序列化模型中的所有

由于您指定的查询集不包含所有字段(并且它是一个sum/distinct,因此不应该包含),因此这肯定会失败

有两种选择

1) 仅为所需的字段创建新的序列化程序,并手动指定它们

class ShiftSum(Serializer):  # NOT model serializer
    shiftid = CharField()
    ... add other fields

return Response(ShiftSum(query, many=True).data)

2) 将查询集转换为列表,直接返回即可

data = list(query) # turns your queryset into [{"shiftid":"n", ...}, ]
return Response(data=data)

如果查询出来的数据已经是您想要的格式,并且已经是简单JSON序列化的正确类型(没有日期时间,没有
十进制
,等等),那么最后一种方法是有效的。试试看是否有效。

你能显示完整的回溯吗?@WillemVanOnsem,请检查更新。谢谢。谢谢,你又救了我一天。很高兴我能帮上忙:)