编辑:对我要问的内容似乎有些疑惑。该模型适用于我在迁移0009中创建的Postgres view。我的印象是,如果模型具有managed = False
选项,Django将不会为模型生成迁移。但是,它仍在努力创造它。
另外,我正在使用Django 1.8和Python 3.4。
我在使用这些链接作为指南创建Postgres视图的Django模型时遇到了问题:drdaeman和eceppda's在Can I use a database view as a model in django中回答。我还在Django's API docs中查找了Options.managed条目。但是,即使这样,它也会创建一个迁移,为视图的模型添加一个表。
到目前为止,这是我的代码:
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
# -*- 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)
]
我做错了什么?
答案 0 :(得分:5)
Django确实为您应用中的每个新添加的表创建了一个迁移,无论它是否是托管模型。但是,当您使用managed=False
设置时,存在非常重要且微妙的差异。结果迁移是虚拟条目。它根本不执行任何SQL。
要确认这一点,请添加一个不受管理的新模型
class Dummy(models.Model):
something = models.IntegerField()
class Meta:
managed = False
现在当你makemigrations
后跟sqlimigrate *myapp* *migration_number*
时,你会发现它不会产生任何sql。
另一方面,如果您确实发现Django正在尝试为您创建一个表,那通常意味着您之前存在相同的模型,但是在管理模型时。要确认这一点,请在migrations
文件夹中搜索VirtualTotal
,这是相关型号的名称。