Sharpless512
Sharpless512

Reputation: 3222

Filter foreign key date django_filters

Currently my filter works so I can filter on name. However I also want to filter on releases (So display game that has release.date between a certain range)

How can I do that?

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()

Upvotes: 3

Views: 323

Answers (3)

frankie567
frankie567

Reputation: 1760

What you can do is define the filter field with distinct=True:

This option can be used to eliminate duplicate results when using filters that span relationships.

Example:

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

Full working example on Repl.it. Query result example: https://drf-filters-distinct--frankie567.repl.co/games/?release_date_after=2019-01-01&release_date_before=2019-12-31

Upvotes: 2

Sharpless512
Sharpless512

Reputation: 3222

releases__date = django_filters.DateFromToRangeFilter()

Did the trick for me

But the problem is if I sort on it, I see duplicates in the game list. Since it outputs a game for every release date

Upvotes: 0

Illia Likhoshva
Illia Likhoshva

Reputation: 1

You can use built-in model filter to do that Like as (for greater or equal than date)

Game.objects.filter(release__date__gte=date)

Upvotes: -1

Related Questions