代码之家  ›  专栏  ›  技术社区  ›  Lord Elrond Mureinik

如何使用django mptt模型进行批量创建?

  •  0
  • Lord Elrond Mureinik  · 技术社区  · 5 年前

    我需要使用 bulk_create django-mptt

    django.db.utils文件.IntegrityError:列“lft”中的null值违反了not null约束 详细信息:失败行包含(2,Magic,null,null,null,null,null,null,1)。

    lft , rght ,和 tree_id ?

    型号.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)
    

    [{
        "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)
    
    0 回复  |  直到 5 年前