URL-адрес Django Rest Framework фильтрует только определенные поля из базы данных

#django #url #django-rest-framework

Вопрос:

Я попытался найти свою проблему в StockOverflow или Google, но я могу найти только то, как создавать результаты поиска и как выполнять поиск по определенным полям, но мне нужен вывод API с конкретными полями с запросом URL.

У меня есть база данных с этими полями:

 date = models.DateField(['%Y-%m-%d'])
channel = models.CharField(max_length=255)
country = models.CharField(max_length=255)
os = models.CharField(max_length=255)
impressions = models.IntegerField() 
clicks = models.IntegerField()
installs = models.IntegerField()
spend = models.FloatField()
revenue = models.FloatField()
 

Я создал различные фильтры, которые можно использовать для группирования, упорядочения и других полезных функций.

Проблема в том, что, например, у меня есть задача:

  1. Покажите количество показов и кликов, которые произошли до 1 июня 2017 года, в разбивке по каналам и странам, отсортированным по кликам в порядке убывания.

Если я использую это:

http://127.0.0.1:8000/api/stock?date_to=2017-05-19amp;groupby=channelamp;groupby=countryamp;ordering=-clicks

Это даст мне такой результат:

    "results": [
        {
            "channel": "adcolony",
            "country": "US",
            "impressions": 101292,
            "clicks": 2479,
            "installs": 445,
            "spend": 743.6999999999999,
            "revenue": 965.12,
            "CPI": "1.67"
        },
 

Он был сгруппирован по «каналу» и «стране» на конкретную дату в порядке убывания.
Но как сделать дополнительные вводы URL (например, показывать только «показы» и «клики»), чтобы показывать ТОЛЬКО те:

    "results": [
        {
            "channel": "adcolony",
            "country": "US",
            "impressions": 101292,
            "clicks": 2479,
        },
 

Это мои взгляды:

 from rest_framework.generics import ListAPIView
from app.models import Stock
from .serializers import StockSerializer
from .filters import StockFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter

class StockListAPIView(ListAPIView):

    serializer_class = StockSerializer
    queryset = Stock.objects.calculated_CLI()

    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
    
    filter_class = StockFilter

    fields = ('id', 'date', 'channel', 'country', 'os', 'impressions', 'clicks', 'installs', 'spend', 'revenue', 'CPI')

    filter_fields = fields
    search_fields = fields
 

And this is my filters:

 from django_filters import rest_framework as rfilters
from app.models import Stock

from django.db.models import Sum, F, ExpressionWrapper, DecimalField
from datetime import date


class StockFilter(rfilters.FilterSet):

    class Meta:
        model = Stock
        fields = ['id', 'date', 'channel', 'country', 'os', 'impressions', 'clicks', 'installs', 'spend', 'revenue']

    date_to = rfilters.CharFilter(method='m_date_to', label='date_to')
    date_from = rfilters.CharFilter(method='m_date_from', label='date_from')
    date = rfilters.CharFilter(method='date_exact', label='date')

    def date_exact(self, queryset, name, value):
        year, month, day = self.date_split(value)
        cdate = date(year, month, day)
        return queryset.filter(date=cdate)

    def m_date_to(self, queryset, name, value):
        year, month, day = self.date_split(value)
        cdate = date(year, month, day)
        return queryset.filter(date__lte=cdate)

    def m_date_from(self, queryset, name, value):
        year, month, day = self.date_split(value)
        cdate = date(year, month, day)
        return queryset.filter(date__gte=cdate)

    def date_split(self, value):
        return [int(x) for x in value.split('-')]


    groupby = rfilters.CharFilter(method='groupby_filter', label='groupby')

    def groupby_filter(self, queryset, name, value):
        return queryset.values(*self.request.query_params.getlist('groupby')).annotate(
                                impressions=Sum('impressions'),
                                clicks=Sum('clicks'),
                                installs=Sum('installs'),
                                spend=Sum('spend'),
                                revenue=Sum('revenue'),
                                CPI=ExpressionWrapper((F('spend')/F('installs')), output_field=DecimalField())
                                )
 

Please be specific.
Thank you.