Django - 如何防止数据库外键约束创建

2023-11-27

我有一个由数据库视图支持的模型。

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

解决方法是取出指向视图的 Meta:db_table 并让sync db 创建 OrgCode 表,然后将 Meta:db_table 放回syncdb 之后。

有没有办法防止为某些模型或字段创建外键约束?

Update:我向相关模型添加了一个静态方法,表明它是一个视图

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 mssqlcreation.py中的DatabaseCreation.sqlfor_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)    

从syncdb生成的sql忽略了约束:

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 信号会起作用......


django开发版本有一个db_constraint字段为ForeignKey模型字段 -docs.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 如何防止数据库外键约束创建 的相关文章

随机推荐