【问题标题】:How to select specify field only in Viewset Django如何仅在 Viewset Django 中选择指定字段
【发布时间】:2019-07-24 09:12:18
【问题描述】:

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

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

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

我想只选择shiftidshiftdescdayname,如何只选择这三个字段,我需要创建新的序列化程序吗?

【问题讨论】:

  • 你能显示完整的回溯吗?
  • @WillemVanOnsem ,请检查更新。谢谢。

标签: python django django-serializer


【解决方案1】:

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

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

有两种选择

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 等),则最后一种方法有效。试试看它是否有效。

【讨论】:

  • 谢谢你,你又拯救了我的一天。
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2019-02-17
  • 2023-01-03
  • 1970-01-01
  • 2019-07-01
  • 2019-04-18
相关资源
最近更新 更多