2015-11-28 192 views
0

我有2種型號:Django管理list_display反向於母公司

1:KW(單個關鍵字)

2:項目(很多關鍵字可以屬於多個不同的項目)

class KW(models.Model): 
    ... 
    project = models.ManyToManyField('KWproject', blank=True) 

class KWproject(models.Model): 
    ProjectKW = models.CharField('Main Keyword', max_length=1000) 
    author = models.ForeignKey(User, editable=False) 

現在當用戶在Admin的KWproject中時,他們應該能夠在list_display中看到屬於所選項目的所有關鍵字。我實現了這一點,但它不覺得正確的方式。

class ProjectAdmin(admin.ModelAdmin): 
    form = ProjectForm 
    list_display = ('Keywordd', 'author') 

    def Keywordd(self, obj): 
     return '<a href="url.co/admin/keywords/kw/?project__id__exact=%s&o=2&q=">%s</a>' % (obj.id, obj.ProjectKW) 
    Keywordd.allow_tags = True 
    Keywordd.admin_order_field = 'ProjectKW' 
    Keywordd.short_description = 'ProjectKW' 

有沒有更好的方式來鏈接,然後list_display有對模型的反向關係的所有項目? (通過我的例子「項目」字段)

回答

0

由於每Django Admin docs

ManyToManyField字段不支持,因爲這將意味着 執行單獨的SQL語句,爲表中的每一行。如果 想要執行此操作,請爲模型提供一種自定義方法,並將該方法的名稱添加到list_display的 。 (請閱讀下面的list_display更多的自定義 方法。)

所以,你可以選擇來實現,像這樣一個自定義模型方法:

# models.py 
class KW(models.Model): 
    ... 
    project = models.ManyToManyField('KWproject', blank=True) 

class KWproject(models.Model): 
    ProjectKW = models.CharField('Main Keyword', max_length=1000) 
    author = models.ForeignKey(User, editable=False) 

    def all_keywords(self): 
     # Retrieve your keywords 
     # KW_set here is the default related name. You can set that in your model definitions. 
     keywords = self.KW_set.values_list('desired_fieldname', flat=True) 
     # Do some transformation here 
     desired_output = ','.join(keywords) 
     # Return value (in example, csv of keywords) 
     return desired_output 

然後,該模型方法添加到您的list_display您的ModelAdmin中的元組。

# admin.py 
class ProjectAdmin(admin.ModelAdmin): 
    form = ProjectForm 
    list_display = ('Keywordd', 'author', 'all_keywords') 

    def Keywordd(self, obj): 
     return '<a href="url.co/admin/keywords/kw/?project__id__exact=%s&o=2&q=">%s</a>' % (obj.id, obj.ProjectKW) 
    Keywordd.allow_tags = True 
    Keywordd.admin_order_field = 'ProjectKW' 
    Keywordd.short_description = 'ProjectKW' 

請注意:這可能是一個非常昂貴的操作。如果您在列表中顯示200行,那麼對頁面的請求將執行200個額外的SQL查詢。