Tôi có một mô hình được hỗ trợ bởi chế độ xem cơ sở dữ liệu.Django - Cách ngăn chặn việc tạo ràng buộc khóa ngoại vi cơ sở dữ liệu
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'
Tôi cần phải tham khảo này trong một mô hình
class AssessmentLocation(models.Model):
name = models.CharField(max_length=150)
org = models.ForeignKey(OrgCode)
tôi không thể chạy syncdb vì ràng buộc khoá ngoại không thể được tạo ra tham khảo một cái nhìn.
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]),
)
Cách giải quyết là để đưa ra các Meta: trỏ db_table đến xem và để db đồng bộ tạo ra các bàn OrgCode, sau đó đặt Meta: db_table trở lại sau khi syncdb.
Có cách nào để ngăn chặn việc tạo ra các ràng buộc khóa ngoại cho một số trường hoặc mô hình nhất định không?
Cập nhật: Tôi đã thêm một phương pháp tĩnh để mô hình có liên quan cho thấy đó là một cái nhìn
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
Sau đó overrode DatabaseCreation.sql_for_inline_foreign_key_references trong 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)
Các sql tạo ra từ syncdb loại bỏ ràng buộc:
CREATE TABLE [main_assessmentlocation] (
[id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[name] nvarchar(150) NOT NULL,
[org] int, -- NO FK CONSTRAINT ANYMORE --
);
Nó liên quan đến hack django_mssql vì vậy tôi sẽ tiếp tục cố gắng, có lẽ hooking vào tín hiệu django.db.backends.signals.connection_created sẽ làm việc ...
Cảm ơn! Đó là những gì tôi cần, bây giờ tôi sẽ chỉ phải chờ cho đến khi nó được phát hành và tôi có thể gỡ bỏ hack của mình. –
'db_constraint' có thể được sử dụng an toàn kể từ phiên bản 1.6 –