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

2024-09-29 23:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从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) 

当我选择这样,错误信息显示

"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'."

我想只选择shiftidshiftdescdayname,如何只选择这三个字段以及我是否需要创建新的序列化程序?你知道吗


Tags: instanceselffalsedatagetshiftmodelsclass
1条回答
网友
1楼 · 发布于 2024-09-29 23:22:17

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

因为您指定的queryset没有包含所有字段(而且它是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序列化的正确类型(没有datetimes,没有Decimal,等等),那么最后一种方法是有效的。试试看是否有效。你知道吗

相关问题 更多 >

    热门问题