2 votes

Modèle Django pour une vue Postgres

Edita: Il semble y avoir une certaine confusion sur ce que je demande. Ce modèle est pour le Vue de Postgres que j'ai créé dans la migration 0009. J'avais l'impression que Django ne génère pas de migration pour un modèle s'il possède l'attribut managed = False option. Cependant, il essaie toujours de la créer.

Par ailleurs, j'utilise Django 1.8 avec Python 3.4.

J'ai des difficultés à créer un modèle Django pour une vue Postgres, en utilisant ces liens comme guide : drdaeman y de l'eceppda réponse en Puis-je utiliser une vue de base de données comme modèle dans Django ? . J'ai aussi regardé l'entrée Options.managed dans Documentation de l'API de Django . Cependant, même avec cela, il crée une migration qui ajoute une table pour le modèle de la vue.

Voici mon code jusqu'à présent :

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/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)
    ]

Qu'est-ce que je fais de mal ?

2voto

mrk Points 23

Django crée une migration pour chaque table nouvellement ajoutée dans votre application, qu'il s'agisse d'un modèle géré ou non. Cependant, il existe une différence très importante et subtile lorsque vous utilisez l'option managed=False réglage. La migration qui en résulte est une entrée fictive. Elle n'exécute pas du tout de SQL.

Pour confirmer cela, ajoutez un nouveau modèle qui n'est pas géré.

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

    class Meta:
       managed = False

maintenant quand vous le faites makemigrations suivi par sqlimigrate *myapp* *migration_number* vous verrez qu'il ne produit pas de sql.

Si, d'un autre côté, vous constatez que Django essaie de créer une table pour vous, cela signifie généralement que le même modèle existait auparavant, mais qu'il a été géré à ce moment-là. Pour le confirmer, recherchez dans votre migrations pour VirtualTotal qui est le nom du modèle en question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X