#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 июня 2017 года, в разбивке по каналам и странам, отсортированным по кликам в порядке убывания.
Если я использую это:
Это даст мне такой результат:
"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.