Подтвердить что ты не робот

Фильтр Django Admin для свойства Foreign Key

Я хочу добавить фильтр в список изменений admin с помощью свойства внешнего ключа, например

class Address(model.Models):
    street = models.CharField(max_length=25)        
    city = models.CharField(max_length=25)
    country = models.CharField(max_length=25)        

class Customer(models.Model):
    name = models.CharField(max_length=25)
    address = models.ForeignKey(Address)

Предположим, что в списке администраторов для клиентов я хочу показать фильтр по городу и стране (так что покажите мне всех клиентов в определенной стране или городе).

Но стандартная функция list_filter(), по-видимому, разрешает фильтрацию по полям непосредственно на модели, а не на любом из ее внешних ключей. Я пробовал:

list_filter = ("address__country",)

или

list_filter = ("address.country",)

но я всегда получаю тот же тип ошибки:

 'address__country' is not a callable or an attribute 

Любые предложения приветствуются. Есть ли какое-то специальное соглашение/синтаксис именования, позволяющее фильтровать свойства FK?

4b9b3361

Ответ 1

См. https://code.djangoproject.com/ticket/3400. Он работает нормально в django 1.3:)

class Room(models.Model):
    house = models.ForeignKey(House)

    def __unicode__(self):
        return self.house.town.name

class Booking(models.Model):
    room = models.ForeignKey(Room)

    def __unicode__(self):
        return self.room.house.town.name

class BookingOpts(admin.ModelAdmin):
    list_filter = ('room__house__town',)
    raw_id_admin = ('room', )

admin.site.register(Town)
admin.site.register(House)
admin.site.register(Room)
admin.site.register(Booking, BookingOpts)

Ответ 2

Я нашел и протестировал следующее решение:

http://www.djangosnippets.org/snippets/1911/

Он работает с ForeignKeys, но он не работает с отношениями ManyToMany.

Ответ 3

Я столкнулся с той же проблемой и действительно нуждался в решении. У меня есть обходное решение, позволяющее создать фильтр для свойства модели, связанной с FK. Вы можете даже пересечь более одного отношения FK. Он создает новый подкласс FilterSpec, который подклассифицирует связанный по умолчанию метод SpecialFilterSpec, который дает вам фильтр в поле ForeignKey.

См. http://djangosnippets.org/snippets/2260/