2016-04-24 128 views
3

如何批量更新Django數據模型的查詢集中的多對多字段?如何批量更新Django查詢集的多對多字段

例如,我有一個名爲Photo的數據模型,另一個名爲PhotoStream。在Photo,我有which_stream = models.ManyToManyField(PhotoStream)

我提取了一個名爲childhood_photosPhotos的查詢集,我需要在該查詢集中的所有對象的多對多字段中添加一個新的PhotoStream對象。我們稱之爲PhotoStream對象for_classmates

我嘗試childhood_photos.update(which_stream.add(for_classmates)),但它給了我一個錯誤:全局名'which_stream'未定義

我該怎麼做這個操作?

回答

3

您可以通過字段的.through屬性訪問您的m2n關係的穿透模型(請參閱documentation)。這將允許您批量創建必要的穿透模型實例:

through_model = Photo.which_stream.through # gives you access to auto-created through model 
# print through_model 
# <class 'app_label.models.Photo_which_stream'> # or sth. similar 

through_model.objects.bulk_create([ 
    through_model(photo_id=pk, photostream_id=for_classmates.pk) 
     for pk in childhood_photos.values_list('pk', flat=True) 
]) 
+1

感謝您的支持。從外觀上看,這是**創造**新領域,但僅限於「貫穿」表。在我看來,這就是我正在嘗試的**更新**過程。因此它們是相同的。想要確認我的頭腦是否正確,是嗎? –

+0

'你只是在桌子上'是什麼意思?直通表是「ManyToManyField」真正發生的唯一場所!這不是創建新的字段(!?),而是將for_classmates流添加到所有需要的照片。 – schwobaseggl

+0

使用'update'操作只會更新特定模型上的字段。關於M2M領域的一點是,它們並不是在特定的表格中實際創建的,而是在數據庫中創建了一個新的直通表格,與您的第一個和第二個表格相關聯。因此,在'Photo'模型中更新'更新'流更新流與在表中創建行不同。 – AKS