2016-09-25 63 views
0

我有兩個型號:AlterField上自動生成的遷移_ptr場引起FieldError

# app1 
class ParentModel(models.Model): 
    # some fields 

現在,在另一個應用程序,我有子模型:

# app2 
from app1.models import ParentModel 


class ChildModel(ParentModel): 
    # some fields here too 

在初始遷移app2 Django的創建OneToOneFieldparent_link=True命名爲parentmodel_ptr

現在我想改變產生的場,讓我們說IntegerField本次車展,所以我創建了這個業務的新移民:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('app2', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AlterField(
      'childmodel', 
      'parentmodel_ptr', 
      models.IntegerField(null=True, blank=True) 
     ) 
    ] 

試圖遷移,我得到了一個異常

django.core.exceptions.FieldError: Auto-generated field 'parentmodel_ptr' in class 'ChildModel' for parent_link to base class 'ParentModel' clashes with declared field of the same name. 

所以是甚至有可能做到這一點?

回答

1

如果您的代碼支持它,您可以將父類更改爲抽象類並擁有子模型中的所有字段。但是,如果你仍然需要單獨的父對象,那麼我不認爲你可以改變Django OneToOne鏈接沒有一些嚴重的黑客攻擊(不推薦)。

如果您只需要關係並且不需要方法等,那麼您可以刪除繼承並使用自創的OneToOneField或將ForeignKey保存到該其他對象的IntegerField。你可以用最終目標來闡述這個問題,所以提供真正的解決方案而不是理論會更簡單。

+0

其實,你說得對。在ModelBase上花費整晚黑客,我終於意識到,最好的方法是創建明確的OneToOneField,並在數據遷移中將_ptr遷移到它。來自auth包的用戶方式。所以我認爲你的回答贊同這個想法:)謝謝! – valignatev