Django 管理后台根据外键属性过滤
我想在管理员的列表中添加一个过滤器,按照外键的某个属性来筛选,比如说:
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 的子类,用来给你在外键字段上提供过滤功能。
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)