2016-11-11 77 views
1

我們如何在ModelViewSet中編寫函數來獲取數據庫中不同記錄的列表?如何在視圖中獲取自定義列表

假設我們有這個模型。

class Animal(models.Model): 

    this_id = models.CharField(max_length=25) 
    name = models.CharField(max_length=25) 
    species_type = models.CharField(max_length=25) 
    ... 

和串行

class AnimalSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Animal 
     fields = (
      'this_id', 
      'name', 
      'species_type', 
      ..., 
     ) 
     read_only_fields = ('id', 'created_at', 'updated_at') 

和視圖集。

class AnimalViewSet(viewsets.ModelViewSet): 
    """ 
    This viewset automatically provides `list`, `create`, `retrieve`, 
    `update` and `destroy` actions. 
    """ 
    queryset = Animal.objects.all() 
    serializer_class = AnimalSerializer 

我發現這個link有用的,例如像裝飾@list_route() 但我無法理解這一點很好。

我想從ViewSet中獲取不同Animal.species_type記錄的列表。請幫忙。

回答

1

過濾有幾種不同的選項。您可以通過您的請求/animals?species_type=MusMusculus發送物種類型,並在您使用視圖中的get_queryset()方法時參考它。

在你看來

def get_queryset(self): 
    species = self.request.query_params.get('species_type', None) 
    if species is not None: 
     queryset = Animals.objects.all().distinct('species_type') 
     species = SpeciesSerializer(data=queryset) 
    return queryset 

串行

from rest_framework import serializers 
class Species(serializers.Serializer): 
    species_type = serializers.Charfield() 

或者,你可以通過Django的過濾器框架http://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend

+1

這不是我的意思是,先生是什麼,我想調用一個函數通過viewset獲取數據庫中所有不同的species_type記錄。這意味着我不會對特定的species_type提出請求。 –

+0

所以你只想要種類?我編輯了我的答案 – Dap

+0

這意味着我們可以在另一個序列化類中定義它?聽起來不錯,我喜歡關於'url_path'的想法。 –