Django - 如何防止创建数据库外键约束 [英] Django - How to prevent database foreign key constraint creation
问题描述
我有一个由数据库视图支持的模型。
I have a model that is backed by a database view.
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'
我需要在另一个模型
class AssessmentLocation(models.Model):
name = models.CharField(max_length=150)
org = models.ForeignKey(OrgCode)
我无法运行syncdb,因为外键限制不能创建引用视图。
I can't run syncdb because foreign key constraints cannot be created referencing a view.
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]),
)
解决方法是取出Meta:db_table指向视图,并让db同步创建OrgCode表,然后将Meta:db_table重新置于syncdb之后。
The workaround is to take out the Meta:db_table pointing to the view and let sync db create the the OrgCode table, then put the Meta:db_table back in after syncdb.
有没有办法阻止某些型号或字段创建外键限制?
Is there a way to prevent the creation of foreign key constraints for certain models or fields?
更新:我向相关模型添加了一个静态方法,表示它是一个视图
Update: I added a static method to the related model indicating it's a view
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
然后在django_mssql中覆盖DatabaseCreation.sql_for_inline_foreign_key_references creation.py:
Then overrode DatabaseCreation.sql_for_inline_foreign_key_references in django_mssql creation.py:
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)
来自syncdb的生成的sql会留下限制:
The generated sql from syncdb leaves out the constraint:
CREATE TABLE [main_assessmentlocation] (
[id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[name] nvarchar(150) NOT NULL,
[org] int, -- NO FK CONSTRAINT ANYMORE --
);
它涉及黑客django_mssql,所以我要继续尝试,也许挂在django。 db.backends.signals.connection_created信号将工作...
It does involve hacking django_mssql so I'm going to keep on trying, maybe hooking into the django.db.backends.signals.connection_created signal will work...
推荐答案
django开发版本有一个 db_constraint
字段 ForeignKey
模型字段 - docs 。
django development version has a db_constraint
field for ForeignKey
model field - docs.
这篇关于Django - 如何防止创建数据库外键约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!