Django Rest Filterset - как фильтровать по вложенному сериализатору? - PullRequest
0 голосов
/ 09 апреля 2020

Добрый вечер, коллеги! У меня есть следующий код:

serializators.py

class CoinCostsSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('price', 'timestamp',)
        model = CoinCosts

class CoinSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('symbol', 'crr', 'costs')
        model = Coins
    costs = CoinCostsSerializer(source='coincosts_set.all', many=True)

views.py

class CoinCostFilterSet(filters.FilterSet):

    class Meta:
        model = Coins
        fields = {
            'symbol': ['exact'],
        }


class CoinCostViewSet(viewsets.ModelViewSet):

    queryset = Coins.objects.all()
    serializer_class = CoinSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = CoinCostFilterSet

models.py

class Coins(models.Model):
    name = models.CharField(max_length=150)
    symbol = models.CharField(max_length=45)
    crr = models.CharField(max_length=3)

class CoinCosts(models.Model):
    coin_id = models.ForeignKey(Coins, on_delete=models.CASCADE)
    crr = models.CharField(max_length=3)
    volume = models.DecimalField(max_digits=19, decimal_places=4)
    reserve = models.DecimalField(max_digits=19, decimal_places=4)
    price = models.DecimalField(max_digits=19, decimal_places=4)
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)

И по например, набрав адрес

/CoinCost/?symbol=ZERO

, у меня есть фильтрация от Django на этой монете.

Поэтому мне нужен этот URL:

/CoinCost/?symbol=ZERO&timestamp_start=2019-12-14T00:00:00&timestamp_end=2019-12-17T00:00:00 
  • получить фильтрацию не только по нулевой монете, но и по отметке времени. Вы можете помочь? Как должен выглядеть мой код для этой задачи? Как фильтровать по встроенному сериализатору?

Я вижу это Отфильтрованные вложенные отношения Django Rest Framework , но> нет работы, у меня есть 2 вложенных поля в сериализаторе - отметка времени и стоимость

Спасибо за помощь! Хороших выходных!

1 Ответ

0 голосов
/ 12 апреля 2020

Фильтрация по отношениям для Django 1.11 и 2.x

import rest_framework_filters as filters
from rest_framework_filters import IsoDateTimeFilter


class CoinFilterSet(filters.FilterSet):

    class Meta:
        model = Coins
        fields = {
            'symbol': ('exact', 'in', 'startswith', 'endswith', 'contains')}


class CoinCostFilterSet(filters.FilterSet):
    coin = filters.RelatedFilter(
        CoinFilterSet, queryset=Coins.objects.all())

    class Meta:
        model = CoinCosts
        fields = {
            'timestamp': ('exact', 'in', 'gt', 'gte', 'lt', 'lte')}
        filter_overrides = {
            DateTimeField: {'filter_class': IsoDateTimeFilter}}

Используйте эти фильтры для таких запросов

/CoinCost/?coin__symbol=ZERO&timestamp__gte=2019-12-14T00:00:00&timestamp__lte=2019-12-17T00:00:00
...