python - 如何仅在Viewset Django中选择指定字段

标签 python django django-serializer

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

当我这样选择时,会显示错误消息

"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 ,如何仅选择这三个字段,我需要创建新的序列化器?

最佳答案

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

由于您指定的查询集不包含您的所有字段(并且它是求和/非重复,所以它不应该),所以这肯定会失败。

有2个选项

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 序列化的正确类型(没有日期时间、没有 Decimal 等),则最后一种方法有效。尝试一下,看看是否有效。

关于python - 如何仅在Viewset Django中选择指定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57179287/

相关文章:

Python 多处理 - 为什么使用 functools.partial 比默认参数慢?

python - 如何找到 git hooks 正在运行的存储库

django - 我可以在 Django 中使用数据库 View 作为模型吗?

Django 身份验证 : Where to put custom templates?

django - 序列化程序嵌套关系无法正常工作

django - 相关模型 ID 在 valid_data 中丢失,即使它存在于请求中

python - 在Python中执行shell命令

python - 使用嵌套列表理解来检查和更改数据框的所有列

python - 使用 MongoEngine for Django,如何按列表的大小过滤 QuerySet 并大于某个值?

python - 扩展用户模型 Django REST framework 3.x.x