django mptt在列“中引发django.db.utils.IntegrityError:null值;lft“;违反非空约束
条件:Django==1.8.7 有一个模型: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,
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