无法获得不同的记录-Django w / Rest Framework

Roe*_*oel 3 python django django-models django-rest-framework

我定义这个viewset,我想创建一个返回不同动物的自定义函数species_typedistinct_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化程序上字段的值时出现dict KeyError 。\ n序列化程序字段的名称可能不正确,并且与实例上的任何属性或键都不匹配。\ n原始异常文本为:u'this_id'。”

e4c*_*4c5 5

麻烦源于此:

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