我想仅从 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 serializerShiftSerializer
.\nThe serializer field might be named incorrectly and not match any attribute or key on thedict
instance.\nOriginal exception text was: 'dayno'."
我只想选择 shiftid
、 shiftdesc
和 dayname
,如何仅选择这三个字段,我需要创建新的序列化器?
最佳答案
您的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/