Модель Django для представления Postgres

Редактировать: кажется, есть некоторая путаница в том, что я спрашиваю. Эта модель предназначена для представления Postgres, которое я создал при миграции. 0009. У меня сложилось впечатление, что Django не будет генерировать миграцию для модели, если у нее есть опция managed = False. Тем не менее, он все еще пытается создать его.

Кроме того, я использую Django 1.8 с Python 3.4.

У меня возникли проблемы с созданием модели Django для представления Postgres, используя эти ссылки в качестве руководства: drdaeman и ответ eceppda в Могу ли я использовать представление базы данных в качестве модели в django. Я также просмотрел запись Options.managed в Документация по API Django. Однако даже при этом создается миграция, которая добавляет таблицу для модели представления.

Это мой код до сих пор:

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

foo/миграции/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)
    ]

Что я делаю неправильно?


person NJP    schedule 29.06.2016    source источник
comment
Здесь нет миграции, которая создает таблицу, как вы описали. Эта миграция показывает пользовательский код, который вы туда вставили.   -  person e4c5    schedule 30.06.2016
comment
Я знаю. Когда после этого я создаю миграции для этого приложения, оно все еще пытается создать таблицу для модели VirtualTotal. У меня сложилось впечатление, что managed = False говорит Django не генерировать миграции для этой таблицы.   -  person NJP    schedule 30.06.2016
comment
что заставляет тебя так говорить?   -  person e4c5    schedule 01.07.2016
comment
Вот как я интерпретировал документацию по API на Options.managed: docs.djangoproject.com /en/1.8/ref/models/options/#managed. Я неправильно истолковываю это? Впервые я прочитал об этом в этом ответе SO: stackoverflow.com/questions/507795/.   -  person NJP    schedule 01.07.2016


Ответы (1)


Django создает миграцию для каждой вновь добавленной таблицы в вашем приложении, независимо от того, является ли это управляемой моделью или нет. Однако есть очень важная и тонкая разница, когда вы используете настройку managed=False. Результирующая миграция является фиктивной записью. Он вообще не выполняет никакого SQL.

Чтобы подтвердить это, добавьте новую неуправляемую модель.

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

    class Meta:
       managed = False

теперь, когда вы делаете makemigrations, а затем sqlimigrate *myapp* *migration_number*, вы увидите, что он не создает никакого sql.

Если, с другой стороны, вы обнаружите, что Django пытается создать для вас таблицу, это обычно означает, что у вас была такая же модель ранее, но в то время, когда модель управлялась. Чтобы убедиться в этом, найдите в папке migrations VirtualTotal название модели, о которой идет речь.

person e4c5    schedule 04.07.2016