Форум сайта python.su
Добрый вечер ув. Гуру. помогите разобраться с передачей аргументов в из url в обработчик!
есть модель
class PersonRankEveryday(models.Model):
class Meta:
db_table = 'db_personrank_everyday'
"""
Рейтинг ежедневной статистики.
"""
sites = models.ForeignKey(Sites)
persons = models.ForeignKey(Persons)
rank_day = models.IntegerField(default=0)
data_scan = models.DateField(verbose_name=u'Дата последнего сканирования')
class PersonRankEverydaySerializer(serializers.HyperlinkedModelSerializer):
site_name = serializers.SerializerMethodField('get_site')
person_name = serializers.SerializerMethodField('get_person')
def get_site(self, keyword):
return str(keyword.sites)
def get_person(self, keyword):
return str(keyword.persons)
class Meta:
model = PersonRankEveryday
fields = ('site_name', 'person_name', 'rank_day', 'data_scan')
router = DefaultRouter()
router.register(r'rankeveryday', views.PersonRankEverydayViewSet, base_name='PersonRankEverydey')
[{"site_name":"lenta.ru","person_name":"****","rank_day":156,"data_scan":"2016-02-01"},{"site_name":"lenta.ru","person_name":"*****","rank_day":101,"data_scan":"2016-02-01"},{"site_name":"lenta.ru","person_name":"*****i","rank_day":88,"data_scan":"2016-02-01"},{"site_name":"lenta.ru","person_name":"*****","rank_day":134,"data_scan":"2016-02-02"}]
class PersonRankEverydayViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for Listing or retrieving personrankeveryday.
"""
def list(self, request):
queryset = PersonRankEveryday.objects.all()
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request , pk=None, format=None):
queryset = PersonRankEveryday.objects.filter(sites_id=pk)
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
Отредактировано ganzhik (Фев. 6, 2016 21:59:27)
Офлайн
1. pip install django-filters==0.2.1
2. Пишешь фильтр с кастомным методом
def date_range_filter(queryset, value): return queryset.filter(date__range[value.split(",")])
class YourCoolFilter(django_filters.FilterSet): dt_range = django_filters.MethodFilter(action=date_range_filter) class Meta: model = YourModel fields = ("dt_range", )
filter_backends = (filters.DjangoFilterBackend, ) filter_class = YourCoolFilter
if self.request.query_params.get("dt_range"): min_, max_ = self.request.query_params.get("dt_range").split(",") queryset = queryset.filter(data_scan__range[min_, max_])
Отредактировано ayb (Фев. 7, 2016 11:25:48)
Офлайн
Сформировал такой url
http://crawler.**********/api/v1/rankeveryday/1/?dt_range=2016-02-01,2016-02-04
class PersonRankEverydayViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for Listing or retrieving personrankeveryday.
"""
def list(self, request):
queryset = PersonRankEveryday.objects.all()
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request , pk=None):
queryset = PersonRankEveryday.objects.filter(sites_id=pk)
filter_backends = (filters.DjangoFilterBackend,)
filter_class = CrawlerFilter
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
def date_range_filter(queryset, value):
return queryset.filter(date__range[value.split(",")])
class CrawlerFilter(django_filters.FilterSet):
dt_range = django_filters.MethodFilter(action=date_range_filter)
class Meta:
model = PersonRankEveryday
fields = ('dt_range',)
Офлайн
filter_class и filter_backends должны быть в атрибутах вьюсета
Офлайн
я понимаю так должно быть пробывал и так до фильтра не доходит все заканчивается в Retrieve
class PersonRankEverydayViewSet(viewsets.ModelViewSet):
"""
A simple ViewSet for Listing or retrieving personrankeveryday.
"""
def list(self, request):
queryset = PersonRankEveryday.objects.all()
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request , pk=None):
queryset = PersonRankEveryday.objects.filter(sites_id=pk)
serializer = PersonRankEverydaySerializer(queryset, many=True)
return Response(serializer.data)
filter_backends = (filters.DjangoFilterBackend,)
filter_class = CrawlerFilter
Офлайн
Значит фильтруй в методе:
def retrieve(self, request , pk=None): queryset = PersonRankEveryday.objects.filter(sites_id=pk) if self.request.query_params.get("dt_range"): min_, max_ = self.request.query_params.get("dt_range").split(",") queryset = queryset.filter(data_scan__range[min_, max_]) serializer = PersonRankEverydaySerializer(queryset, many=True) return Response(serializer.data)
Офлайн
Респект Уважуха) вообщем спасибки большое!!
queryset = queryset.filter(data_scan__range) немного подправил
queryset = queryset.filter(data_scan__rangemin_, max_)) так заработало а так все гуд! плюсик в копилку
Офлайн
queryset = queryset.filter(data_scan__range[min_, max_])
queryset = queryset.filter(data_scan__range=(min_, max_))
Офлайн