2017-07-27 74 views
0

我试图从反向外键对象中获取一些不同的属性,并在django管理list_display上显示它。但这种电流法将调用的数据库查询多次缓存django管理显示中的反向外键对象

models.py: 
class Author(models.Model): 
    name = models.CharField() 
    ... 
    def get_all_book(self): 
     return self.book_set.all() 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    aaa = some field type 
    bbb = some field type 
    ... 

admin.py: 
class AuthorAdmin(admin.ModelAdmin): 
    def book_aaa(obj): 
     booklist = obj.get_all_book 
     all_bookaaa = ",".join([k.aaa for k in booklist]) 
     return all_bookaaa 
    def book_bbb(obj): 
     booklist = obj.get_all_book 
     all_bookbbb = ",".join([k.bbb for k in booklist]) 
     return all_bookbbb 
    list_display = ('name', book_aaa, book_bbb) 

admin.site.register(Author, AuthorAdmin) 

,因为我需要在单独的列的图书信息分开,但如果使用这种方法,它可能会被称为“book_set.all()”查询集两次,这对演出非常不利。是否有任何正确的方法来实现这个问题?

+0

我刚刚发现了一个解决方案,但有点跛脚,通过创建obj的额外属性,并检查obj是否已经具有该属性,如果None然后get_all_book,否则直接返回它。 – paugoo

回答

0

通过创建对象的额外属性,并检查该属性是否存在。

def get_booklist(self, obj): 
    if not hasattr(obj, 'booklist') 
     obj.booklist = obj.get_all_book 
    return obj 
def book_aaa(self, obj): 
    booklist = self.get_booklist(obj).booklist 
    all_bookaaa = ",".join([k.aaa for k in booklist]) 
    return all_bookaaa 
def book_bbb(self, obj): 
    booklist = self.get_booklist(obj).booklist 
    all_bookbbb = ",".join([k.bbb for k in booklist]) 
    return all_bookbbb 
list_display = ('name', 'book_aaa', 'book_bbb') 

也许这不是最好的解决方案,但至少可以防止queryset被多次调用。