用于Postgres视图的Django模型

NJP*_*NJP 3 python django postgresql django-migrations

编辑:关于我在问什么似乎有些困惑。该模型用于我在迁移0009中创建的Postgres视图。给人的印象是,如果Django有此managed = False选项,则不会为该模型生成迁移。但是,它仍在尝试创建它。

另外,我将Django 1.8与Python 3.4结合使用。

我在使用以下链接作为指南时,无法为Postgres视图创建Django模型:drdaemaneceppda的答案是否可以在django中将数据库视图用作模型。我还查找了Django API文档中的Options.managed条目。但是,尽管如此,它仍在创建迁移,该迁移为视图的模型添加了表。

到目前为止,这是我的代码:

foo / models.py

class RelevantModel(models.Model):
    rebate_pool_total = models.OneToOneField('foo.VirtualTotal', null=True)
    total = models.DecimalField(null=True, decimal_places=2, max_digits=32)

class VirtualTotal(models.Model):
    relevant_model = models.ForeignKey('foo.RelevantModel')
    total = models.DecimalField(null=True, decimal_places=2, max_digits=32)

    class Meta:
        managed = False
Run Code Online (Sandbox Code Playgroud)

foo / migrations / 0009_add_foo_view.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('foo', '0008_previous_migration'),
    ]

    sql = """
    create VIEW foo_virtualtotal AS
      SELECT rest of view...
    """

    operations = [
        migrations.RunSQL('DROP VIEW IF EXISTS foo_virtualtotal;'),
        migrations.RunSQL(sql)
    ]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

e4c*_*4c5 5

Django会为您的应用程序中的每个新添加的表创建迁移,无论它是否为托管模型。但是,使用该managed=False设置时有非常重要且细微的区别。结果迁移是一个虚拟条目。它根本不执行任何SQL。

要确认这一点,请添加不受管理的新模型

class Dummy(models.Model):
    something = models.IntegerField()

    class Meta:
       managed = False
Run Code Online (Sandbox Code Playgroud)

现在,当您makemigrations紧随其后时,sqlimigrate *myapp* *migration_number*您将看到它不会产生任何sql。

另一方面,如果您确实发现Django正在尝试为您创建表,则通常意味着您早先拥有相同的模型,但在管理模型时已经存在。要确认这一点,请在您的migrations文件夹中搜索VirtualTotal所涉及模型的名称。