Фильтр администратора Django с использованием выражений F ()

Кто-нибудь знает, как фильтровать в админке на основе сравнения полей модели - выражения F ()?

Предположим, у нас есть следующая модель:

class Transport(models.Model):
    start_area = models.ForeignKey(Area, related_name='starting_transports')
    finish_area = models.ForeignKey(Area, related_name='finishing_transports')

Теперь я бы хотел создать админ-фильтр, который позволяет фильтровать объекты в области и за пределами области, где объекты в области - это те, у которых start_area и finish_area совпадают, а trans-area - другие.

Я попытался добиться этого, создав собственный FilterSpec, но возникли две проблемы:

  • FilterSpec привязан только к одному полю.
  • FilterSpec не поддерживает выражения F () и исключает.

Вторую проблему можно решить, определив собственный класс ChangeList, но я не вижу способа решить первую.

Я также попытался «эмулировать» фильтр прямо в экземпляре ModelAdmin, перегрузив метод queryset и отправив дополнительный контекст в шаблон списка изменений, где сам фильтр будет жестко запрограммирован и распечатан вручную. К сожалению, кажется, проблема заключается в том, что Django извлекает мои параметры GET (используемые в ссылке на фильтр), поскольку они неизвестны экземпляру ModelAdmin, и вместо этого ставит только? E = 1, который должен сигнализировать о некоторой ошибке.

Заранее всем спасибо.

РЕДАКТИРОВАТЬ : Похоже, что функциональные возможности, которые позволят это сделать, запланированы в следующем выпуске Django, см. http://code.djangoproject.com/ticket/5833 . Тем не менее, кто-нибудь знает, как это сделать в Django 1.2?

12
задан xaralis 25 November 2010 в 10:40
поделиться