2017-07-27 137 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被多次調用。