Roe*_*oel 3 python django django-models django-rest-framework
我定义这个viewset,我想创建一个返回不同动物的自定义函数species_type叫distinct_species。
class AnimalViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Animal.objects.all()
serializer_class = AnimalSerializer
@list_route()
def distinct_species(self, request):
query_set = Animal.objects.values('species_type').distinct()
serializer = self.get_serializer(query_set, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
这是我的Animal模特
class Animal(models.Model):
this_id = models.CharField(max_length=25)
name = models.CharField(max_length=25)
species_type = models.CharField(max_length=25)
breed = models.CharField(max_length=25)
....
Run Code Online (Sandbox Code Playgroud)
这是我的 AnimalSerializer
class AnimalSerializer(serializers.ModelSerializer):
class Meta:
model = Animal
fields = (
'this_id',
'name',
'species_type',
'breed',
...
)
read_only_fields = ('id', 'created_at', 'updated_at')
Run Code Online (Sandbox Code Playgroud)
我在这里注册路线。
# Create a router and register our viewsets with it.
router = DefaultRouter()
router.register(r'animal', AnimalViewSet)
urlpatterns = [
url(r'^api/', include(router.urls)),
url(r'^', IndexView.as_view(), name='index'),
]
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时 /api/animal/distinct_species/
我得到了这个KeyError:
u“尝试获取
this_id序列AnimalSerializer化程序上字段的值时出现dictKeyError 。\ n序列化程序字段的名称可能不正确,并且与实例上的任何属性或键都不匹配。\ n原始异常文本为:u'this_id'。”
麻烦源于此:
query_set = Animal.objects.values('species_type').distinct()
Run Code Online (Sandbox Code Playgroud)
您的query_set对象现在是词典列表。该词典仅包含一个字段-species_type
[{'species_type':'a'},{'species_type':'b'},...]
因此,它没有this_id您的序列化程序所需要的。如果您使用的是Postgresql,则可以将查询更改为
query_set = Animal.objects.distinct('species_type')
Run Code Online (Sandbox Code Playgroud)
第二种选择是在values()调用中列出序列化程序所需的所有字段
第三种选择是创建一个不同的序列化器供distinct_species端点使用,该序列化器将不是ModelSerializer