2015-12-04 110 views
0

我有這個代碼表填充。正確的方法來bulk_create ManyToMany領域,Django?

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: invalid keyword argument for this function我要救標籤對象第一(由於多對多場),然後通過add()附加照片給他們。但對於大型count這個過程需要很長時間。有沒有什麼方法可以重構這段代碼以使其更快?

通常我想用隨機虛擬數據填充標籤模型。

EDIT 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 

回答

1

這是我知道的最快的方法,我用這一切的時候創建的測試數據。我可以在幾分鐘內生成數百萬條記錄。從格奧爾基

編輯:

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) 

    tag_to_photo_links = [] 
    for photo_id in photo_ids: 
     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) 

我沒有創建的模型進行測試,但結構是存在的,您可能需要調整一些東西使它工作。如果遇到任何問題,請告訴我。

[編輯]

+0

嗨,對不起,延遲的答案。我可以說,你有正確的想法來使用'通過',我確實爲自己找到了同樣的解決方案,雖然這個功能在文檔上很短,你能爲我提供一些建議嗎?您是一位高級Python開發人員,至少與我相比,我必須閱讀一些文檔才能完全理解您的答案,但我必須承認,簡單的複製和過去對我來說並不適用。非常感謝你的幫助!我稍後會嘗試添加其他信息。 – Georgy

+0

你可以發佈照片的模型定義嗎? –

+0

對不起,我花了一段時間。該模型在編輯部分。 – Georgy