2011-11-08 19 views
7

Veritabanı görünümü tarafından desteklenen bir modelim var.Django - Veritabanı yabancı anahtar kısıtlaması oluşturma nasıl engellenir

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' 

başka modelde yabancı anahtar kısıtlamaları bir görünüm başvuran oluşturulamaz çünkü syncdb koşamam

class AssessmentLocation(models.Model): 
    name    = models.CharField(max_length=150) 
    org     = models.ForeignKey(OrgCode) 

bu başvuru gerekir.

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

geçici çözüm Meta dışarı almaktır: db_table görünümüne işaret ve izin senkron db sonra, OrgCode tablo oluşturmak Meta koydu: geri syncdb sonra db_table.

Belirli model veya alanlar için yabancı anahtar kısıtlamalarının oluşturulmasını önlemenin bir yolu var mı? Güncelleştirme

:

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)  

oluşturulan SQL: o

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 

sonra django_mssql creation.py içinde DatabaseCreation.sql_for_inline_foreign_key_references overrode bir manzara gösteren ilgili modeli statik bir yöntem ilave syncdb bu kısıtlamayı ortadan kaldırır:

CREATE TABLE [main_assessmentlocation] (
    [id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY, 
    [name] nvarchar(150) NOT NULL, 
    [org] int, -- NO FK CONSTRAINT ANYMORE -- 
); 
012 Eğer ayarlarsanız

O yüzden belki çalışacak django.db.backends.signals.connection_created sinyal içine çengel, denemeye devam edeceğim django_mssql hack nasıl yapılıyor ...

cevap

10

django geliştirme sürümü, ForeignKey model alanına sahip db_constraint model alanına sahiptir - docs.

+0

Teşekkürler! İhtiyacım olan buydu, şimdi bir sürümde inmesini beklemek zorundayım ve hack'imi kaldırabilirim. –

+1

'db_constraint' 1.6 sürümünden beri güvenle kullanılabilir –

4

modeliniz en içinde managed=False (Django docs) Meta sınıfı, Django, syncdb'yi çalıştırdığınızda tabloyu oluşturmayacaktır.

class AssessmentLocation(models.Model): 
    name = models.CharField(max_length=150) 
    org = models.ForeignKey(OrgCode) 

    class Meta: 
     managed = False 

Django provide initial sql data bir kancaya sahiptir. Django'yu, tabloyu oluşturduktan hemen sonra oluşturmak için bunu (ab?) Kullanabiliriz.

oluşturmak tablo deyimi içeren bir dosya myapp/sql/assessmentlocation.sql oluştur: AssessmentLocation modeline yabancı anahtarlarla diğer modellere varsa Django çalıştırmadan önce yabancı anahtar kısıtlamasını uygulamak çalışırsa

CREATE TABLE [main_assessmentlocation] (
    [id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY, 
    [name] nvarchar(150) NOT NULL, 
    [org] int, -- NO FK CONSTRAINT ANYMORE -- 
); 

, sorunları olabilir tabloyu oluşturmak için özel sql. Aksi takdirde, bu yaklaşımın işe yarayacağını düşünüyorum.

+0

Teşekkürler! Buna baktım ve işe yarıyor. Görünüm tabanlı ilgili nesne modeli, diğer geliştiriciler tarafından kullanılmak üzere oluşturduğum bir çerçevenin bir parçasıdır. Ben syncdb model oluşturma ve standart django docs sapmak için çalışmıyorum. –

İlgili konular