Фильтр даты внешнего ключа django_filters - PullRequest
3 голосов
/ 16 октября 2019

В настоящее время мой фильтр работает, поэтому я могу фильтровать по имени. Тем не менее, я также хочу фильтровать релизы (так что отображать игру, в которой release.date находится в определенном диапазоне)

Как это сделать?

filters.py

class ReleaseFilter(django_filters.FilterSet):

    date =  django_filters.DateFromToRangeFilter(field_name='date') 

    class Meta:
        model = Release
        fields = ['date']

class GameFilter(django_filters.FilterSet):

    name = django_filters.CharFilter(lookup_expr='icontains')
    releases = ReleaseFilter()

    class Meta:
        model = Game
        fields = ['releases']

models.py

class Game(models.Model):
    name = models.CharField(max_length=255)


class Release(models.Model):
    game = models.ForeignKey(Game, related_name='releases', on_delete=models.CASCADE)
    date = models.DateField()

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Что вы можете сделать, это определить поле фильтра с помощью distinct=True:

Этот параметр можно использовать для устранения дублирующихся результатов при использовании фильтров, которые охватывают отношения.

Пример:

release_date = django_filters.DateFromToRangeFilter(field_name='releases__date', distinct=True)

Полный рабочий пример на Repl.it . Пример результата запроса: https://drf -filters-distinct--frankie567.repl.co / games /? Release_date_after = 2019-01-01 & release_date_before = 2019-12-31

0 голосов
/ 18 октября 2019
releases__date = django_filters.DateFromToRangeFilter()

Сделал трюк для меня

Но проблема в том, что если я сортирую по нему, я вижу дубликаты в списке игр. Так как он выводит игру на каждую дату выпуска

0 голосов
/ 16 октября 2019

Вы можете использовать встроенный фильтр модели, чтобы сделать это как (как больше или равно date)

Game.objects.filter(release__date__gte=date)
...