我有这个代码表填充。
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
,这个过程太长了。有没有什么方法可以重构此代码以使其更快?
一般来说,我想用随机的虚拟数据填充标签模型。
编辑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
2条答案
按热度按时间qxsslcnc1#
TL;DR使用Django自动生成的**“through”**模型批量插入m2m关系。
这是我所知道的最快的方法,我一直用它来创建测试数据。我可以在几分钟内生成数百万条记录。
来自Georgy的编辑:
我没有创建模型来测试,但结构是存在的,你可能需要调整一些东西来使其工作。如果你遇到任何问题,请告诉我。
[编辑]
iecba09b2#
正如Du D的回答所示,Django ManyToMany字段使用了一个名为
through
的表,其中包含三列:关系的ID、链接到 * 的对象的ID和链接到 * 的对象的ID。您可以在through
上使用bulk_create
来批量创建ManyToMany关系。举个简单的例子,你可以批量创建标签到照片的关系,如下所示:
一般溶液
下面是一个通用的解决方案,您可以运行它来设置任何对象对列表之间的ManyToMany关系。
用法示例