2010-02-25 33 views
5

我有一個獨特的問題,它應該在django管理中處理。更好的方式來表示Django admin中的多對多關係管理

我有以下車型結構...

class Product(models.Model): 
    name = models.CharField(max_length = 100) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2) 


    def __unicode__(self): 
     return self.name 


class Country(models.Model): 
    name = models.CharField(max_length = 2) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2)  

    def __unicode__(self): 
     return self.name 


class CountryProduct(models.Model): 
    country = models.ForeignKey(Country) 
    product = models.ForeignKey(Product) 
    overriden_price = models.DecimalField(max_digits = 5, decimal_places = 2) 

    class Meta: 
     unique_together = (("country", "product"),) 

如圖所示有許多產品和國家之間的多對多關係....我想爲壓倒一切的基礎價格管理界面爲特定的國家和產品。

一個選項有如下的用戶界面,這裏破折號( - )表示默認價格和數字值表示給定國家和產品的覆蓋價格。

countries -> | US | UK 
products  |  | 
--------------------------- 
Product1  | - | 10 
Product2  | 5 | 7 

但我不知道該怎麼辦....

我打開看看替代方法(包括模型結構的變化),以及只要符合要求。 ..你的任何形式的投入肯定會向我有用...

感謝提前:)

回答

2

我得到了解決,這裏就是我的回答我的問題......我想與大家分享......我改變了模型下面的方式....

class Product(models.Model): 
    name = models.CharField(max_length = 100) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2) 


    def __unicode__(self): 
     return self.name 


class Country(models.Model): 
    name = models.CharField(max_length = 2) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2)  
    products = models.ManyToManyField(Product, through = 'CountryProduct') 

    def __unicode__(self): 
     return self.name 


class CountryProduct(models.Model): 
    country = models.ForeignKey(Country) 
    product = models.ForeignKey(Product) 
    overriden_price = models.DecimalField(max_digits = 5, decimal_places = 2) 

    class Meta: 
     unique_together = (("country", "product"),) 


class CountryProductInline(admin.TabularInline): 
    model = CountryProduct 

class CountryAdmin(admin.ModelAdmin): 
    inlines = [CountryProductInline] 

class ProductAdmin(admin.ModelAdmin): 
    inlines = [CountryProductInline] 

雖然這不是我期望的方式,這給我更好的解決方案....

0

有沒有辦法內置到Django管理做你所需要的。

您可以創建自己的自定義視圖,並以此方式進行。你可以添加額外的視圖到一個admin.ModelAdmin類,這將做你需要的。

0

這是 - 可能 - 一個可怕的設計。你的數據庫表應該包含正確的價格。

你的應用程序現在必須做兩件事。它必須從其他地方(不在此表中)獲得默認價格,並且還必須獲得覆蓋價格(從該表中)並將這兩條信息放在一起。

你不能簡單地使SQL與你顯示的網格類型工作。

您不能輕易讓Django管理員使用您顯示的網格。你可以嘗試創建一個網格模板,但它對於這種多對多關係是獨一無二的,所以你還必須定製Django管理視圖來將你的模板用於多對多表,並使用普通的默認模板所有其他表格。

要創建網格,您必須獲取您所有的國家和產品。然後您必須創建適當的列表清單。然後你可以編寫自己的模板來顯示它。在擁有超過12個左右的國家後,電網將變得如此寬泛以致幾乎無用。但是對於前幾個國家來說,你可以完成這項工作。

您必須創建您自己的模板和您自己的視圖函數來執行此操作。

編輯

「我打開看看替代方法(包括模型結構的變化),以及只要符合要求」

哪些需求?糟糕的設計需要兩次查詢才能找到價格?這是必需的嗎?

還是非常困難的網格佈局?這是必需的嗎?

目前尚不清楚「要求」是什麼,所以不可能提出任何替代方案。只能說

  1. 一個SQL設計,分別查詢基礎和覆蓋將更慢,更復雜。

  2. SQL設計具有從「動態默認值」加載並且可以由用戶更改(或不可更改)的單個值,這非常簡單得多。這可以通過參數initial來完成。 http://docs.djangoproject.com/en/dev/ref/forms/fields/#initial

  3. SQL不能輕易將多行轉換爲網格狀結構。這需要複雜的SQL(遠遠超出ORM的功能)或視圖函數中的Python處理。

  4. Django管理員根本不會做網格狀結構。

+0

這不是一個完整的設計,只是想簡化問題,這就是以這種方式表示的原因....你是對的以這種方式呈現電網並不是一個好主意,但那只是我的一個選擇...... – 2010-02-26 06:27:48

+0

您能否詳細說明在項目2上:動態默認?這個「覆蓋」的問題是我自己碰到的並且從來沒有感覺到舒適實施的東西。是否有任何文章可以探討這個問題('sql overrides'太籠統了,不能讓我們爲你做些什麼)。 – Koobz 2010-03-01 04:43:58

+0

「Dynamic Default」只是一個默認值,它不是在模型中靜態定義的,而是基於當前數據,事務狀態或其他內容動態加載的。它只是一個默認值,它會在運行時動態加載到表單中。閱讀:http://docs.djangoproject.com/en/dev/ref/forms/fields/#initial – 2010-03-01 13:26:27