如果我需要数据库视图或不需要?

问题描述:

我有这些模型:如果我需要数据库视图或不需要?

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

我总是尽量避免使用数据库视图,存储过程以及一般“在数据库本身中”而不是在应用程序代码库中的东西,原因很简单,因为它很难维护(还有你告别数据库不可知的应用程序)。

我的建议是坚持使用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

我不知道为什么你认为你需要一个数据库视图在这里。一般来说,你不要在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