如何选择只在视图集中Django的指定场(How to select specify field o

2019-09-29 09:52发布

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

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

“得到KeyError异常当试图获取字段中的值dayno上串行ShiftSerializer 。\ n该串行场可能不正确,而不是命名匹配的任何属性或关键dict实例\ nOriginal异常文本是:‘dayno’”

我想选择shiftidshiftdescdayname只,如何选择只有这三个领域,我是需要创建新的串行?

Answer 1:

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 ,等)。 尝试一下,看看它是否工作。



文章来源: How to select specify field only in Viewset Django