在Django中使用数据库视图

时间:2009-06-25 02:07:15

标签: database django-models

我看到问题can i use a database view as a model in django并在我的应用中尝试过,但这不起作用。

我手动创建了一个名为"vi\_topics"的视图,它有"id"列,但我一直收到错误,即使我明确添加了“id”字段,也说

  

“没有这样的专栏:vi_topics.id”

以下是名为Vitopic的模型的定义:

from django.db import models

class Vitopic(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author_name = models.CharField(max_length=200)
    author_email = models.CharField(max_length=200)
    view_count = models.IntegerField(default=0)
    replay_count = models.IntegerField(default=0)
    tags = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'vi_topics'

注意:我使用的是sqlite3。

2 个答案:

答案 0 :(得分:3)

试试这个: http://docs.djangoproject.com/en/dev/ref/models/options/#managed

  

管理

     

Options.managed

     

Django 1.1中的新功能:请参阅发行说明

     

默认为True,这意味着Django将在syncdb中创建相应的数据库表,并将其作为重置管理命令的一部分删除。也就是说,Django管理数据库表的生命周期。

     

如果为False,则不会对此模型执行数据库表创建或删除操作。如果模型表示通过其他方式创建的现有表或数据库视图,则此选项非常有用。当托管为False时,这是唯一的区别。模型处理的所有其他方面与正常情况完全相同。这包括

     
      
  1. 如果未声明,则将自动主键字段添加到模型。为避免以后的代码阅读器混淆,建议在使用非托管模型时指定您正在建模的数据库表中的所有列。
  2.   
  3. 如果managed = False的模型包含指向另一个非托管模型的ManyToManyField,则也不会创建多对多连接的中间表。但是,将创建一个托管模型和一个非托管模型之间的中间表。

         

    如果您需要更改此默认行为,请将中间表创建为显式模型(根据需要使用托管集),并使用ManyToManyField.through属性使关系使用您的自定义模型。

  4.         

    对于涉及托管= False的模型的测试,由您来确保在测试设置中创建正确的表。

答案 1 :(得分:1)

id = models.IntegerField(primary_key = True)