django mptt在列“中引发django.db.utils.IntegrityError:null值;lft“;违反非空约束

django mptt在列“中引发django.db.utils.IntegrityError:null值;lft“;违反非空约束,django,migration,mptt,Django,Migration,Mptt,条件:Django==1.8.7 有一个模型: class Tree(mptt_models.MPTTModel): name = models.CharField(max_length=120, unique=True) slug = models.SlugField(max_length=256, unique=True) parent = mptt_models.TreeForeignKey('self', null=True, blank=True,

条件:Django==1.8.7

有一个模型:

class Tree(mptt_models.MPTTModel):
    name = models.CharField(max_length=120, unique=True)
    slug = models.SlugField(max_length=256, unique=True)
    parent = mptt_models.TreeForeignKey('self', null=True, blank=True,
                                        related_name='children', db_index=True)

    class MPTTMeta:
        order_insertion_by = ['name']
我可以用管理界面填充它,并显示在网站页面上

我可以用django shell填充它:

Python 2.7.3 (default, Jun 22 2015, 19:43:34)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from src.catalog.models import Tree
>>> Tree.objects.create(name='1', slug='2')
<Tree: 1>
>>> Tree.objects.all()
[<Tree: 1>]
我有以下错误:

django.db.utils.IntegrityError: null value in column "lft" violates not-null constraint
执行该行时:

parent = Tree.objects.create(name=category.title, slug=category.slug)

仍然无法理解此错误的原因:(

我刚刚遇到相同的问题,原因是使用app\u注册表导入模型。 在迁移中替换此选项:

Tree = app_registry.get_model('catalog', 'Tree')
使用普通导入,就像您在shell中所做的那样

from src.catalog.models import Tree
它应该很有魅力


但是,我不知道为什么第一种方法不起作用,因为就我而言,这是在迁移文件中导入模型的首选方法。

您不应该在迁移中导入模型。使用建议的方法获取模型:

apps.get\u model(“app\u name”、“ModelClassName”)
然后创建模型实例,并在保存之前将以下成员设置为0:

lft
rght
level
tree\u id

为您的模型创建一个
post_migration
hook,并在那里重建MPTT树,例如

@receiver(迁移后)
def rebuild_处理程序(发送方,**kwargs):
如果sender.name==“您的应用程序名称”:
YourModelClass.objects.rebuild()

在此处检查更好更标准的解决方案
from src.catalog.models import Tree