如何 select 仅在 Viewset Django 中指定字段

How to select specify field only in Viewset Django

我想 select 不同的字段和一些仅来自 Django ViewSet 的字段。

我的方法

@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) 

当我select那样时,错误信息显示

"Got KeyError when attempting to get a value for field dayno on serializer ShiftSerializer.\nThe serializer field might be named incorrectly and not match any attribute or key on the dict instance.\nOriginal exception text was: 'dayno'."

我只想 select shiftidshiftdescdayname,如何 select 这三个字段,我是否需要创建新的序列化器?

您的 ShiftSerializer 使用 __all__,这意味着它将尝试序列化您模型中的所有字段。

由于您指定的查询集不包括您的所有字段(它是一个 sum/distinct,所以它不应该),那么这肯定会失败。

有2个选项

1) 仅为您想要的字段创建一个新的序列化程序,手动指定它们

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

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

2) 将queryset转换为列表,直接return就可以了

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

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