2015-12-09 174 views
0

我試圖更新某個文章的created_by和edited_by,它與用戶具有ManytoMany關係並向其中添加了另一個用戶。在過濾器後更新Django的ManytoMany

我碰到 MyModel.objects.filter(pk=some_value).update(field1='some value')

來作爲一種方式,用一個單一的查詢,更新,有沒有辦法用一個單一的查詢也更新多對多?

Article.objects.filter(Q(created_by__in=[deleted_user_id])| Q(edited_by__in=[deleted_user_id])).update(?)

我應該代替 「?」用? 假設我需要將「replacement_user_id」添加到過濾器返回的所有文章中。

我想我們可以通過查詢「通過」模型來完成。

+0

會是怎樣的最佳方法呢?如果我不能使用.update()方法。 for循環查詢集中的所有項目,然後.add()是我知道的一種方法。比這更好的嗎? – mascot6699

回答

0

這是不可能的使用更新方法:

只能設置非關係領域和使用該 method.To更新非關係領域ForeignKey的領域,提供新的值作爲 不變。要更新ForeignKey字段,請將新值設置爲要指向的新模型實例 。

瞭解更多here

更新:

您可以添加multilple對象,如:

articles = Article.objects.filter(Q(created_by__in=[deleted_user_id])| Q(edited_by__in=[deleted_user_id])) 
created_by_objs = User.objects.filter(...) 
edited_by_objs = User.objects.filter(...) 

for article in articles: 
    #article.created_by.clear() uncomment if needed 
    article.created_by.add(*created_by_objs) 
    #article.edited_by.clear() uncomment if needed 
    article.edited_by.add(*edited_by_objs) 

瞭解更多here

+0

什麼是最好的方法呢?如果我不能使用.update()方法。 for循環查詢集中的所有項目,然後.add()是我知道的一種方法。比這更好的嗎? – mascot6699

+0

@ mascot6699你可以這樣做.add(* [obj1,obj2,obj3])。在此處瞭解更多信息:https://docs.djangoproject.com/en/1.8/ref/models/relations/#django.db.models.fields.related.RelatedManager.add –