2010-05-25 55 views
4

我有兩個Django模型(簡體):格式內嵌許多一對多在Django管理提出了相關模型

class Product(models.Model): 
    name = models.TextField() 
    price = models.IntegerField() 

class Invoice(models.Model): 
    company = models.TextField() 
    customer = models.TextField() 
    products = models.ManyToManyField(Product) 

我想看到的相關產品作爲一個漂亮的表(中產品字段)位於管理員的「發票」頁面中,並且可以鏈接到單獨的各個產品頁面。

我的第一個想法是使用管理員的內聯 - 但Django使用每個相關產品的選擇框小部件。這沒有鏈接到產品頁面,並且由於我有成千上萬的產品,並且每個選擇框獨立下載所有產品名稱,所以它很快變得不合理地變慢。

所以我轉而使用ModelAdmin.filter_horizo​​ntal作爲建議here,它使用了一個不同小部件的單個實例,其中有一個所有產品列表和另一個相關產品列表,您可以在稍後添加\刪除產品來自前者。這解決了緩慢,但它仍然不顯示相關的產品領域,並且它是不可鏈接的。

那麼,我該怎麼辦?調整視圖?覆蓋ModelForms?我谷歌搜索,找不到任何這樣的代碼的例子...

回答

0

也許這不是你所期望的,但我會介紹將發票鏈接到產品的InvoiceItem模型。所以你會有2x 1:n而不是m:n關係。然後使用內聯自定義表單作爲產品選擇的InvoiceItem和raw_id_fields。

在InvoiceItem表單中,您可以添加只讀字段,以顯示您需要顯示的值。您必須爲Form init中的這些字段提供數據,以便從InvoiceItem實例讀取它們。或者,您也可以從raw_id_field小部件派生,並在此小部件的呈現方法中追加產品模型中的一些附加數據?

0

這是一個古老的問題,但我今天已經涉及到它。

您可以在這裏找到了答案 - https://blog.ionelmc.ro/2012/01/19/tweaks-for-making-django-admin-faster/

代碼:

class MyAdmin(admin.TabularInline): 
    fields = 'myfield', 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     formfield = super(MyAdmin, self).formfield_for_dbfield(db_field, **kwargs) 
     if db_field.name == 'myfield': 
      # dirty trick so queryset is evaluated and cached in .choices 
      formfield.choices = formfield.choices 
     return formfield 

這可以從像5分鐘,15秒左右任何削減你的等待時間。