Django的ManyToMany字段的bulk_create的正确方法?

乔治

我有用于表填充的这段代码。

def add_tags(count):
    print "Add tags"
    insert_list = []
    photo_pk_lower_bound = Photo.objects.all().order_by("id")[0].pk
    photo_pk_upper_bound = Photo.objects.all().order_by("-id")[0].pk
    for i in range(count):
        t = Tag( tag = 'tag' + str(i) )
        insert_list.append(t)
    Tag.objects.bulk_create(insert_list)
    for i in range(count):
        random_photo_pk = randint(photo_pk_lower_bound, photo_pk_upper_bound)
        p = Photo.objects.get( pk = random_photo_pk )
        t = Tag.objects.get( tag = 'tag' + str(i) )
        t.photos.add(p)

这是模型:

class Tag(models.Model):
    tag = models.CharField(max_length=20,unique=True)
    photos = models.ManyToManyField(Photo)

据我理解这个答案:Django:此函数的关键字参数无效,我必须先保存标签对象(由于ManyToMany字段),然后通过将照片附加到它们add()但是,从count长远来看,此过程耗时太长。有什么方法可以重构此代码以使其更快?

通常,我想用随机虚拟数据填充Tag模型。

编辑1(照片模型)

class Photo(models.Model):
    photo = models.ImageField(upload_to="images")
    created_date = models.DateTimeField(auto_now=True)
    user = models.ForeignKey(User)

    def __unicode__(self):
       return self.photo.name
杜丁

TL; DR使用“直通”模型批量插入m2m关系。

Tag.photos.through => Model with 3 fields [ id, tag, photo ]
new_tag_photo = Tag.photos.through(tag_id=1, photo_id=2)
Tag.photos.through.bulk_insert([new_tag_photo, ...])

这是我所知道的最快的方法,我一直在使用它来创建测试数据。我可以在几分钟内生成数百万条记录。

从乔治编辑:

def add_tags(count):
    new_tags = []
    for t in range(count):
        tag = Tag(tag='tag%s' % t)
        new_tags.append(tag)
    Tag.objects.bulk_create(new_tags)

    tag_ids = list(Tag.objects.values_list('id', flat=True))
    photo_ids = Photo.objects.values_list('id', flat=True)
    tag_count = len(tag_ids)
       
    for photo_id in photo_ids:
        tag_to_photo_links = []
        shuffle(tag_ids)

        rand_num_tags = randint(0, tag_count)
        photo_tags = tag_ids[:rand_num_tags]

        for tag_id in photo_tags:
            # through is the table generated by django to link m2m between tag and photo
            photo_tag = Tag.photos.through(tag_id=tag_id, photo_id=photo_id)
            tag_to_photo_links.append(photo_tag)

        Tag.photos.through.objects.bulk_create(tag_to_photo_links, batch_size=7000)

我没有创建要测试的模型,但是这里的结构可能需要进行一些调整才能使其正常工作。让我知道您是否遇到任何问题。

[编辑]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django bulk_create检查多个字段的重复条目

来自分类Dev

django的bulk_create是原子的吗?

来自分类Dev

django bulk_create查询中的外键关系?

来自分类Dev

我可以信任Django的bulk_create保留订单吗?

来自分类Dev

Django bulk_create ignore_conflicts =真正泄漏内存

来自分类Dev

Django bulk_create with ignore_conflicts = True给定ProgrammingError

来自分类Dev

如何处理Django对象的异常。bulk_create()

来自分类Dev

在bulk_create上插入由django ORM创建的语句

来自分类Dev

django bulk_create 是否可能出现异常

来自分类Dev

Django ORM bulk_create 1:1 相关模型

来自分类Dev

Django - ManyToMany 字段 - 建立正确的链接

来自分类Dev

Django bulk_create在插入行时是否锁定整个表?

来自分类Dev

Django 1.7-使用bulk_create插入模型数据,然后保存

来自分类Dev

如何使用嵌套模型在django REST Framework中进行bulk_create?

来自分类Dev

具有唯一约束的Django高效bulk_create

来自分类Dev

Django在执行bulk_create时设置many_to_many对象

来自分类Dev

带有 UUID primary_key 的 Django bulk_create IntegrityError(重复条目)

来自分类Dev

Django,ManyToMany字段,使用额外的字段获取正确的对象

来自分类Dev

在 Django 模型方法中引用 ManyToMany 字段

来自分类Dev

如何对许多对象使用bulk_create()进行save()操作

来自分类Dev

Django查询ManytoMany字段

来自分类Dev

ManyToMany字段的建模方法

来自分类Dev

ManyToMany字段的建模方法

来自分类Dev

有没有更简单的方法将bulk_create()与许多查询一起用于实例创建项目

来自分类Dev

在Django中查询ManyToMany字段

来自分类Dev

Django麻烦创建ManyToMany字段

来自分类Dev

Django ManyToMany 字段 - 通过表访问字段

来自分类Dev

通过模型了解Django中的ManyToMany字段

来自分类Dev

Django过滤器ManyToMany字段

Related 相关文章

  1. 1

    Django bulk_create检查多个字段的重复条目

  2. 2

    django的bulk_create是原子的吗?

  3. 3

    django bulk_create查询中的外键关系?

  4. 4

    我可以信任Django的bulk_create保留订单吗?

  5. 5

    Django bulk_create ignore_conflicts =真正泄漏内存

  6. 6

    Django bulk_create with ignore_conflicts = True给定ProgrammingError

  7. 7

    如何处理Django对象的异常。bulk_create()

  8. 8

    在bulk_create上插入由django ORM创建的语句

  9. 9

    django bulk_create 是否可能出现异常

  10. 10

    Django ORM bulk_create 1:1 相关模型

  11. 11

    Django - ManyToMany 字段 - 建立正确的链接

  12. 12

    Django bulk_create在插入行时是否锁定整个表?

  13. 13

    Django 1.7-使用bulk_create插入模型数据,然后保存

  14. 14

    如何使用嵌套模型在django REST Framework中进行bulk_create?

  15. 15

    具有唯一约束的Django高效bulk_create

  16. 16

    Django在执行bulk_create时设置many_to_many对象

  17. 17

    带有 UUID primary_key 的 Django bulk_create IntegrityError(重复条目)

  18. 18

    Django,ManyToMany字段,使用额外的字段获取正确的对象

  19. 19

    在 Django 模型方法中引用 ManyToMany 字段

  20. 20

    如何对许多对象使用bulk_create()进行save()操作

  21. 21

    Django查询ManytoMany字段

  22. 22

    ManyToMany字段的建模方法

  23. 23

    ManyToMany字段的建模方法

  24. 24

    有没有更简单的方法将bulk_create()与许多查询一起用于实例创建项目

  25. 25

    在Django中查询ManyToMany字段

  26. 26

    Django麻烦创建ManyToMany字段

  27. 27

    Django ManyToMany 字段 - 通过表访问字段

  28. 28

    通过模型了解Django中的ManyToMany字段

  29. 29

    Django过滤器ManyToMany字段

热门标签

归档