我有一个与Book有外键关系的Person模型.本书有很多领域,但我最关心的是"作者"(标准的CharField).
话虽如此,在我的PersonAdmin模型中,我想使用"list_display"显示"book.author".我已经尝试了所有这些明显的方法(见下文),但似乎没有任何效果.有什么建议?
class PersonAdmin(admin.ModelAdmin): list_display = ['book.author',]
imjoevasquez.. 444
作为另一种选择,您可以查找如下:
class UserAdmin(admin.ModelAdmin): list_display = (..., 'get_author') def get_author(self, obj): return obj.book.author get_author.short_description = 'Author' get_author.admin_order_field = 'book__author'
Will.. 131
尽管上面有很多很好的答案,而且由于我是Django的新手,我还是被困住了.这是我从一个非常新手的角度来解释的.
models.py
class Author(models.Model): name = models.CharField(max_length=255) class Book(models.Model): author = models.ForeignKey(Author) title = models.CharField(max_length=255)
admin.py(错误的方式) - 你认为它可以通过使用'model__field'来引用,但事实并非如此
class BookAdmin(admin.ModelAdmin): model = Book list_display = ['title', 'author__name', ] admin.site.register(Book, BookAdmin)
admin.py(正确的方法) - 这是你如何引用Django方式的外键名称
class BookAdmin(admin.ModelAdmin): model = Book list_display = ['title', 'get_name', ] def get_name(self, obj): return obj.author.name get_name.admin_order_field = 'author' #Allows column order sorting get_name.short_description = 'Author Name' #Renames column head #Filtering on side - for some reason, this works #list_filter = ['title', 'author__name'] admin.site.register(Book, BookAdmin)
有关其他参考,请参阅此处的Django模型链接
作为另一种选择,您可以查找如下:
class UserAdmin(admin.ModelAdmin): list_display = (..., 'get_author') def get_author(self, obj): return obj.book.author get_author.short_description = 'Author' get_author.admin_order_field = 'book__author'
尽管上面有很多很好的答案,而且由于我是Django的新手,我还是被困住了.这是我从一个非常新手的角度来解释的.
models.py
class Author(models.Model): name = models.CharField(max_length=255) class Book(models.Model): author = models.ForeignKey(Author) title = models.CharField(max_length=255)
admin.py(错误的方式) - 你认为它可以通过使用'model__field'来引用,但事实并非如此
class BookAdmin(admin.ModelAdmin): model = Book list_display = ['title', 'author__name', ] admin.site.register(Book, BookAdmin)
admin.py(正确的方法) - 这是你如何引用Django方式的外键名称
class BookAdmin(admin.ModelAdmin): model = Book list_display = ['title', 'get_name', ] def get_name(self, obj): return obj.author.name get_name.admin_order_field = 'author' #Allows column order sorting get_name.short_description = 'Author Name' #Renames column head #Filtering on side - for some reason, this works #list_filter = ['title', 'author__name'] admin.site.register(Book, BookAdmin)
有关其他参考,请参阅此处的Django模型链接
和其他人一样,我也跟着咔嚓声.但他们有一个缺点:默认情况下,你不能订购它们.幸运的是,有一个解决方案:
def author(self, obj): return obj.book.author author.admin_order_field = 'book__author'
请注意,添加该get_author
函数会减慢admin中的list_display,因为显示每个人都会进行SQL查询.
要避免这种情况,您需要get_queryset
在PersonAdmin中修改方法,例如:
def get_queryset(self, request): return super(PersonAdmin,self).get_queryset(request).select_related('book')
之前:36.02ms中的73个查询(管理员中有67个重复查询)
之后:在10.81ms内进行6次查询
根据文档,您只能显示__unicode__
ForeignKey 的表示形式:
http://docs.djangoproject.com/en/dev/ref/contrib/admin/#list-display
奇怪的是它不支持'book__author'
在DB API中的其他地方使用的样式格式.
原来这个功能的票证被标记为"无法修复".
您可以使用callable在列表显示中显示您想要的任何内容.它看起来像这样:
def book_author(object): return object.book.author class PersonAdmin(admin.ModelAdmin): list_display = [book_author,]
我刚刚发布了一个片段,使admin.ModelAdmin支持'__'语法:
http://djangosnippets.org/snippets/2887/
所以你可以这样做:
class PersonAdmin(RelatedFieldAdmin): list_display = ['book__author',]
这基本上只是做其他答案中描述的相同的事情,但它自动处理(1)设置admin_order_field(2)设置short_description和(3)修改查询集以避免每行的数据库命中.
这个已经被接受了,但如果还有其他的假人(像我一样)没有立即从目前接受的答案中得到它,这里有更多的细节.
ForeignKey
需要在其中引用__unicode__
方法引用的模型类,如下所示:
class Category(models.Model): name = models.CharField(max_length=50) def __unicode__(self): return self.name
这对我来说有所不同,应该适用于上述场景.这适用于Django 1.0.2.