Tengo un modelo respaldado por una vista de base de datos.Django - Cómo evitar la creación de restricciones de la clave externa de la base de datos
class OrgCode(models.Model):
org_code = models.CharField(db_column=u'code',max_length=15)
org_description = models.CharField(max_length=250)
org_level_num = models.IntegerField()
class Meta:
db_table = u'view_FSS_ORG_PROFILE'
Necesito hacer referencia a esto en otro modelo
class AssessmentLocation(models.Model):
name = models.CharField(max_length=150)
org = models.ForeignKey(OrgCode)
no puedo correr syncdb debido a restricciones de clave externa no se pueden crear referencia a una vista.
u"Foreign key 'FK__main_asse__org__1D114BD1'
references object 'view_FSS_ORG_PROFILE'
which is not a user table.", None, 0, -214
7217900), None)
Command:
CREATE TABLE [main_assessmentlocation] (
[id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[name] nvarchar(150) NOT NULL,
[org] int NOT NULL REFERENCES [view_FSS_ORG_PROFILE] ([id]),
)
La solución consiste en sacar la Meta: db_table que apunta a la vista y dejar db sincronización crear la tabla del OrgCode, a continuación, poner el Meta: DB_Table de nuevo después de syncdb.
¿Hay alguna manera de evitar la creación de restricciones de clave externa para ciertos modelos o campos?
Actualización: I añadió un método estático para el modelo relacionado que indica que es una vista
class OrgCode(models.Model):
org_code = models.CharField(max_length=15)
org_description = models.CharField(max_length=250)
@staticmethod
def is_backend_view():
return True
Entonces hicieron caso omiso DatabaseCreation.sql_for_inline_foreign_key_references en creation.py django_mssql:
def sql_for_inline_foreign_key_references(self, field, known_models, style):
try:
field.rel.to.is_backend_view()
return "", False
except:
return super(DatabaseCreation,self).sql_for_inline_foreign_key_references(field, known_models, style)
el SQL generado a partir de syncdb deja fuera la restricción:
CREATE TABLE [main_assessmentlocation] (
[id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[name] nvarchar(150) NOT NULL,
[org] int, -- NO FK CONSTRAINT ANYMORE --
);
Esta consiste en cortar django_mssql así que voy a seguir intentando, quizás enganchar en la señal django.db.backends.signals.connection_created va a funcionar ...
¡Gracias! Eso es lo que necesitaba, ahora solo tendré que esperar a que aterrice en un lanzamiento y puedo eliminar mi truco. –
'db_constraint' se puede usar de forma segura desde la versión 1.6 –