2012-04-17 89 views
1

我有這些模型:如果我需要數據庫視圖或不需要?

class Company(models.Model): 
    name=models.CharField(max_length=100) 
    description=models.TextField() 
    #some more fields 

class Product(models.Model): 
    name=models.CharField(max_length=100) 
    company=models.ForeignKey(Company) 
    #some more fields 

class Category(models.Model): 
    parent=models.ForeignKey('self',null=True,blank=True) 
    name=models.CharField(max_length=100) 
    products=models.ManyToManyField(Product,null=True,blank=True) 
    #some more fields 

就像你看到的每家公司都有產品的列表,每個產品屬於某個類別,我會用company pk得到每家公司的類別列表,有什麼最佳實踐?我應該定義一個數據庫視圖嗎?我該怎麼做?

注意:我從來沒有在django中使用數據庫視圖,我搜索了它,這聽起來不容易!

+0

什麼是你的問題?如何獲得與公司匹配的類別? – agf 2012-04-17 08:14:19

+0

是的,最好的做法是做到這一點! – 2012-04-17 08:25:02

回答

2

我總是儘量避免使用數據庫視圖,存儲過程以及一般「在數據庫本身中」而不是在應用程序代碼庫中的東西,原因很簡單,因爲它很難維護(還有你告別數據庫不可知的應用程序)。

我的建議是堅持使用django orm(這可以做很多事情),並且只有當您無法獲得體面的演出,或者您需要通過存儲過程/視圖提供的某些高級功能才能使用該解決方案。

在django中使用視圖非常簡單。

假設您有1個查看視圖,您可以在db上創建視圖,然後使用匹配視圖'列(名稱和類型)的字段編寫模型。

UPDATE: 然後,您需要在元類定義中將表名稱設置爲視圖名稱。

之後,你需要告訴Django不上寫,不要試圖創建一個表視圖模型,幸運的是,一個CONF:

class ViewModel(models.Model): 
    ... view columns ... 

    class Meta(): 
     db_table = 'view_name' 
     managed = False 
+0

我不明白的是如何將模型與視圖關聯? – 2012-04-17 08:31:59

+0

@Asma對不起,我忘了提及,你現在可以在答案中看到:) – 2012-04-17 09:14:25

+0

我看不到在答案中的變化:D – 2012-04-17 10:10:57

1

我不知道爲什麼你認爲你需要一個數據庫視圖在這裏。一般來說,你不要在Django中使用它們,因爲你通過ORM執行Python中的所有邏輯。

要獲得類別列表一個公司,你可以這樣做:

categories = Category.objects.filter(products__company=my_company) 

其中my_company是你感興趣的公司實例

+0

我不強調使用查看,我只想做一個很好的表現,因爲我有幾個公司,每個主題都有很多產品,tnx :) – 2012-04-17 08:51:24

+0

這種方式沒有性能問題嗎?如果是這樣,U會使用ORM。 – 2012-04-17 10:29:16

+0

@Asma試試看看你是否有性能問題。如果你沒有 - 這是很好的表現。 – DrTyrsa 2012-04-17 11:59:47