Django Admin过滤外键属性

时间:2010-03-04 13:49:51

标签: python django filter 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属性?

3 个答案:

答案 0 :(得分:20)

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)

答案 1 :(得分:1)

我找到并测试了以下解决方案:

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

它适用于ForeignKeys,但它不适用于ManyToMany关系。

答案 2 :(得分:0)

我遇到了同样的问题,确实需要一个解决方案。我有一个解决方法,允许您在FK相关的模型属性上创建过滤器。您甚至可以遍历多个FK关系。它创建了一个新的FilterSpec子类,该子类是用于为ForeignKey字段提供过滤器的默认RelatedFilterSpec的子类。

请参阅http://djangosnippets.org/snippets/2260/