从Django 1.8.2到Django 1.11的继承模型

时间:2017-04-10 15:42:45

标签: python django django-models

我的任务是将项目从django版本1.8.2转换为版本1.11。面对一个我无法应对的问题。在1.8.2版本中表现出色的表格模型在版本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')

1 个答案:

答案 0 :(得分:0)

因为Page模型是由Manufacture模型继承的,所以django创建了一个代理字段"制造"对于Page对象,但此名称在CarModel模型中使用,这会导致冲突。在django 1.8版中,该字段被称为" manufacture_ptr",因此没有冲突。在django 1.9,1.10,1.11的版本中,该字段被称为"制造"。

解决方案是从"制造"更改CarModel模型中的字段名称。到另一个。