Q:

Custom фильтр django admin

Суть задачи следующая нужно как то сделать не самый простой фильтр. Есть 2 модели в разных приложениях.
# Приложение Blocks - файл models.py
class Block(models.Model):
    id = models.AutoField(primary_key = True)
    name = models.CharField(max_length = 255)
    description = models.TextField()
    status = models.BooleanField(default = True)

# Приложение Sites - файл models.py
from apps.blocks.models import Block

class Site(models.Model):
    id = models.AutoField(primary_key = True)
    name = models.CharField(max_length = 255, )
    description = models.TextField()
    blocks = models.ManyToManyField(Block)

И мне нужно модель Block отфильтровать по полю name модели Site.
Пример: 
Есть три записи в модели Block: <Запись 1>, <Запись 2>, <Запись 3>,
а в модели Site две записи: <Ресурс 1>, <Ресурс 2>.
Когда я захожу в admin django в модель Block я хочу видеть в фильтре все Site которые которые связанны хотя бы с одним Block.
Как вы делаете подобные фильтры. Извините за моё странное объяснение.

A:

Чтобы увидеть в фильтре все Site, которые связанны хотя бы с одним Block, вам необходимо переопределить метод lookups, внутри которого вы вычислите id и name тех Site, которые вам необходимо отображать (пример ниже). Поле id - будет для внутреннего использования, name - для отображение в панели администратора. 
Далее в методе queryset вы можете отфильтровать объекты Blocks по выбранному пользователем значению, если пользователь пока ничего не выбрал, то ничего нечего не делается.
Ниже привожу примерный код фильтра:
class SiteFilter(admin.SimpleListFilter):

    title = 'Фильтр по Site'
    parameter_name = 'site_id'
    field_name = 'site__id'

    def lookups(self, request, model_admin):
        """Доступныe фильтры по Site."""
        queryset = model_admin.get_queryset(request)
        sites = Site.objects.filter(block__in=queryset).distinct()
        for site in sites:
            yield (site.id, site.name)

    def queryset(self, request, queryset):
        site_id = self.value()
        if site_id:
            return queryset.filter(**{self.field_name: site_id})
        return queryset

