2016-03-24 25 views
1

我有這樣的模式:如何爲Django Rest Framework指定過濾數據參數?

class Entry(models.Model): 
    time = models.DateTimeField() 
    no2 = models.FloatField() 
    co = models.FloatField() 
    humidity = models.FloatField() 
    temperature = models.FloatField() 

和休息的看法:

class DataList(ListAPIView): 
    serializer_class = EntrySerializer 

    def get_queryset(self): 
     return Entry.objects.all() 

我希望有下一個選項來過濾通過GET參數(如/項目週期=一週?)數據:

  1. 獲取最後一個條目
  2. 獲取最近7天中每一天的平均值
  3. 獲取過去12個月的每個月的平均值。

如何通過django rest框架實現它?

回答

2

您可以將參數引用到您的get_queryset方法中,並根據您的參數列出您的條目。

class DataList(ListAPIView): 
    serializer_class = EntrySerializer 

    def get_queryset(self): 
     period = request.query_params.get('period') 

     if period == 'last': # for last entry 
      queryset = Entry.objects.last() 
     elif period == 'week': 
      # queryset for week 
     elif period == 'month': 
      # queryset for month 
     return queryset 
+1

只是FYI,你的初始'if'語句需要縮進一個級別。 – IAmKale

+0

謝謝,我現在修好了。 –

1

的確可以通過調整get_queryset方法做到這一點,但超過API過濾更好的解決方案是使用django-filter包。 DRF支持這個開箱:)

# filters.py 
import django_filters 

from rest_framework import filters 

class EntryFilter(filters.FilterSet): 
    period = django_filters.MethodFilter() 

    class Meta: 
     model = Entry 
     fields = ('period',) # here you can add any fields from Entry model 

    def filter_period(self, queryset, value): 
     if value == 'last': 
      pass 
     elif value == 'week': 
      pass 
     else: 
      pass # rest of your if's 
     return queryset 

的然後在您的ApiView類

class DataList(ListAPIView): 
    queryset = Entry.objects.all() 
    serializer_class = EntrySerializer 
    # filtering part 
    filter_backends = (DjangoFilterBackend,) 
    filter_class = EntryFilter 

與此去將讓您的APIView級潔淨,更具可讀性和過濾邏輯放在它應該放在..在過濾器:)

相關問題