Django admin custom filter by ManyToMany through model

259 Views Asked by At

I need to create a filter in Django admin by a Through Model.

class Location(models.Model):
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    lat = models.DecimalField(max_digits=13, decimal_places=10, default=None)
    lon = models.DecimalField(max_digits=13, decimal_places=10, default=None)

class Place(models.Model):
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    lat = models.DecimalField(max_digits=13, decimal_places=10, default=None)
    lon = models.DecimalField(max_digits=13, decimal_places=10, default=None)
    ways = models.ManyToManyField(location.Location, through='Way')

class Way(models.Model):
    created_at = models.DateTimeField(editable=False, auto_now_add=True)
    place = models.ForeignKey(Place, on_delete=models.PROTECT,)
    location = models.ForeignKey(Location, on_delete=models.PROTECT,)
    drive_distance = models.IntegerField(null=True, default=None,)

Way model contains a drive_distance between models Place and Location.

In the Django admin list display, I want to create a custom filter to filter out places, which has more that 0 locations where drive distance <= 100. Say, just a simple yes/no filter.

How to do it? I can create a custom filter for the model fields, for a model relation, but I can't filter by a through model values.

I use Django 3.1.

0

There are 0 best solutions below