Django 管理后台根据外键属性过滤

28 投票
3 回答
28118 浏览
提问于 2025-04-15 20:00

我想在管理员的列表中添加一个过滤器,按照外键的某个属性来筛选,比如说:

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 

欢迎任何建议。有没有什么特别的命名规则或语法可以用来过滤外键属性?

3 个回答

0

我遇到了同样的问题,真的需要一个解决方案。我找到了一种变通的方法,可以让你在一个与外键(FK)相关的模型属性上创建过滤器。你甚至可以跨越多个外键关系。这个方法创建了一个新的 FilterSpec 子类,它是默认的 RelatedFilterSpec 的子类,用来给你在外键字段上提供过滤功能。

可以查看这个链接:http://djangosnippets.org/snippets/2260/

1

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

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

这个方法适用于外键(ForeignKeys),但是不适用于多对多关系(ManyToMany relations)。

28

请查看这个链接: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)

撰写回答