2014-05-23 72 views
0

我想在時間上使用Django並將其插入令人興奮的PostgreSQL數據庫中。 我用python manage.py inspectdb提取我的數據庫的模型,但是當我想要同步我的數據庫我有這樣的錯誤:Django多對多的relionships

CommandError: One or more models did not validate: 
api.subdomain: Accessor for field 'sub_domain' clashes with related field 'Domain.subdomain_set'. Add a related_name argument to the definition for 'sub_domain'. 
api.subdomain: Accessor for field 'domain' clashes with related field 'Domain.subdomain_set'. Add a related_name argument to the definition for 'domain'. 

以下是造成問題的類:

class Domain(models.Model): 
    id = models.IntegerField(primary_key=True) 
    extra_data = models.CharField(max_length=127, blank=True) 
    class Meta: 
     managed = False 
     db_table = 'domain' 

class SubDomain(models.Model): 
    sub_domain = models.ForeignKey(Domain) 
    domain = models.ForeignKey(Domain) 
    extra_data = models.CharField(max_length=127, blank=True) 
    class Meta: 
     managed = False 
     db_table = 'sub_domain' 

我沒有創造與SQLAlchemy的這是我做過什麼,使其工作:

class Domain(Base):                            
    __tablename__ = 'domain'                           
    id = Column(Integer,                      
       primary_key=True,                    
       autoincrement=True)                  
    extra_data = Column(String(127))                  
    sub_domains = relationship("SubDomain",                   
           backref="domain",                  
           primaryjoin="Domain.id == SubDomain.domain_id") 

class SubDomain(Base): 
    __tablename__ = 'sub_domain'                                                   
    sub_domain_id = Column(Integer,                     
          ForeignKey('domain.id'),                 
          primary_key=True)                   
    domain_id = Column(Integer,                     
         ForeignKey('domain.id'),                 
         primary_key=True)                     
    sub_domain = relationship("Domain",                    
           foreign_keys=[sub_domain_id],               
           backref="sub_domains_assocs") 
    extra_data = Column(String(127)) 

要解釋我的關係:

每個Domain有多個SubDomain和每個SubDomain本身是Domain,他們的關係是extra_dataSubDomain的資格。每個SubDomain可以有多個父母。每個Domain在其字段extra_data中都有自己的規範。

我試過在StackOverflow上找到多個答案,但沒有一個爲我的案件工作。

感謝您的幫助!

回答

1

在您的SQLAlchemy示例中,您明確設置了backref以避免衝突:您需要在使用related_name的Django版本中執行相同操作。

class SubDomain(models.Model): 
    sub_domain = models.ForeignKey(Domain) 
    domain = models.ForeignKey(Domain, related_name='sub_domains_assocs') 
    extra_data = models.CharField(max_length=127, blank=True) 

雖然這看起來有點奇怪,用MPTT等提供的顯式層次結構可能會更好。