我有一個數據庫視圖支持的模型。Django - 如何防止數據庫外鍵約束創建
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,因爲不能建立外鍵約束引用視圖引用此。
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]),
)
解決方法是取出元:db_table指向視圖,讓同步數據庫創建的OrgCode表,然後把元:db_table回來後執行syncdb。
有沒有辦法阻止某些模型或字段的外鍵約束的創建?
更新:我添加了一個靜態方法相關的示範指示它是一個視圖
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 creation.py DatabaseCreation.sql_for_inline_foreign_key_references:
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)
從生成的SQL syncdb忽略了約束:
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信號將工作...
謝謝!這就是我所需要的,現在我只需要等待它發佈,然後我就可以刪除我的黑客。 –
從版本1.6開始,可以安全地使用db_constraint –