2017-04-10 49 views
0

我有將項目從django版本1.8.2轉換爲版本1.11的任務。面對一個我無法應付的問題。表格的這種模式,這在1.8.2工作非常出色,停在1.11版本的工作,並以一個錯誤掉出來:從Django 1.8.2到Django的繼承模型1.11

core.CarModel.manufacture: (models.E006) The field 'manufacture' clashes with the field 'manufacture' from model 'core.page'. 

顯然,這是由於車型的繼承,因爲該項目是舊的,我可以沒有從根本上改變表格的方案,請告訴我如何擺脫這種情況。 非常感謝您的幫助。

我已複製模型的方案,該方案在1.8.2正常工作和停止工作對1.11:

# -*- coding:utf-8 -*- 
from django.db import models 
from django.contrib.contenttypes.models import ContentType 


class InheritanceCastModel(models.Model): 

    real_type = models.ForeignKey(ContentType, editable=False) 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.real_type = self._get_real_type() 
     super(InheritanceCastModel, self).save(*args, **kwargs) 

    def _get_real_type(self): 
     return ContentType.objects.get_for_model(type(self)) 

    def cast(self): 
     return self.real_type.get_object_for_this_type(pk=self.pk) 

    class Meta: 
     abstract = True 


class Page(InheritanceCastModel): 
    title = models.CharField(max_length=512, verbose_name=u'Title', blank=True) 


class Manufacture(Page): 
    ru_title = models.CharField(max_length=128, verbose_name=u'RU Title') 


class CarModel(Page): 
    # here problem:   
    manufacture = models.ForeignKey(Manufacture, verbose_name=u'Manufacture') 
    ru_title = models.CharField(max_length=64, verbose_name=u'RU Title') 

回答

0

,因爲頁面模型是由製造模型繼承,Django的創建一個代理領域「製造「用於頁面對象,但該名稱用於CarModel模型中,這會導致衝突。在django 1.8版中,這個字段被稱爲「manufacture_ptr」,所以沒有衝突。在django 1.9,1.10,1.11版本中,該字段被稱爲「製造」。

解決方法是將CarModel模型中的字段名稱從「製造」更改爲另一個。