gpt4 book ai didi

python - 如何使用 django-mptt 模型进行 bulk_create?

转载 作者:行者123 更新时间:2023-12-05 04:58:31 25 4
gpt4 key购买 nike

我需要在 django-mptt 上使用 bulk_create模型,但出现错误:

django.db.utils.IntegrityError: null value in column "lft" violates not-null constraintDETAIL: Failing row contains (2, Magic, null, null, null, null, null, null, 1).

如何在不对 lftrghttree_id 进行硬编码的情况下批量创建 django-mptt 模型?

管理工程师

模型.py:

from mptt.models import MPTTModel, TreeForeignKey

class Category(MPTTModel):
parent = TreeForeignKey('self', on_delete=models.CASCADE, blank=True,
null=True, related_name='children',
)
name = models.CharField(max_length=255)
tcgplayer_category = models.ForeignKey('tcgplayer.TcgCategory', on_delete=models.PROTECT,
blank=True, null=True)

class Meta:
unique_together = (
('parent', 'name'),
)

def __str__(self):
return self.name

class TcgCategory(models.Model):
id = models.PositiveSmallIntegerField(primary_key=True)
name = models.CharField(max_length=255)

class CategoryGroup(models.Model):
id = models.IntegerField(primary_key=True)
category = models.ForeignKey('tcgplayer.TcgCategory', on_delete=models.CASCADE)

fixtures/category.json:

[{
"model": "tcgplayer.tcgcategory",
"pk": 1,
"fields": {
"name": "Magic",
}
}, {
"model": "tcgplayer.categorygroup",
"pk": 1,
"fields": {
"category": 1,
"name": "10th Edition",
}
}, {
"model": "tcgplayer.categorygroup",
"pk": 2,
"fields": {
"category": 1,
"name": "7th Edition",
}
}]

任务.py:

def convert_categories(category_ids):
root_categories = TcgCategory.objects.filter(id__in=category_ids)
category_parents = Category.objects.bulk_create([ # error is thrown here
Category(
tcgplayer_category_id=model['id'],
name=model['name'],
)
for model in root_categories.values('id', 'name')
])
for parent in category_parents:
category_groups = CategoryGroup.objects.filter(category_id=parent.tcgplayer_category_id)
category_models.extend([
Category(
tcgplayer_category_id=model['id'],
name=model['name'],
parent=parent,
)
for model in category_groups.values('id', 'name')
])
Category.objects.bulk_create(category_models)

最佳答案

回复晚了,但对 lftrghttree_id 进行硬编码并没有错。这实际上是recommended在创建模型后添加 MPTTModel 类时,只要在创建后运行 rebuild

for parent in category_parents:
category_groups = CategoryGroup.objects.filter(category_id=parent.tcgplayer_category_id)
category_models.extend([
Category(
tcgplayer_category_id=model['id'],
name=model['name'],
parent=parent,
lft=0,
rght=0,
tree_id=0
)
for model in category_groups.values('id', 'name')
])
Category.objects.bulk_create(category_models)
Category.objects.rebuild()

您可能需要将模型稍微调整为 add some kind of ordering虽然

from mptt.models import MPTTModel, TreeForeignKey

class Category(MPTTModel):
parent = TreeForeignKey('self', on_delete=models.CASCADE, blank=True,
null=True, related_name='children',
)
name = models.CharField(max_length=255)
tcgplayer_category = models.ForeignKey('tcgplayer.TcgCategory', on_delete=models.PROTECT,
blank=True, null=True)

class Meta:
unique_together = (
('parent', 'name'),
)

def __str__(self):
return self.name

class MPTTMeta:
order_insertion_by = ['name']

关于python - 如何使用 django-mptt 模型进行 bulk_create?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63907716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com