2016-07-15 6 views
1

私は以下の問題があります:同じmany_to_manyフィールドを持つオブジェクトのセットを更新する必要があります。だから私は、M2Mオブジェクトがサポートされていないようだと、 users = Users.objects.filter(**somefilters)django:ManyToManyを使ったオブジェクトの一括更新

実際に更新操作が機能しないBlog.objects.filter(#getting very large list of blogs).update(users=users)ような何かをしようと、今、次のモデル

class Blog: 
    name = CharField 
    users = M2M(User) 

class User: 
    name = CharField 

とを持って言うことができます。 そして、私は何かのリストに

for blog in large_list_of_blogs: 
    blog.users.add(users) 

を実行しようとしていた場合、すべてのオブジェクトが個別にアクセスされるように、それは、非常に非常に遅いです。

答えて

1

できることは、bulk_createをM2Mリレーションの中間モデルに使用することです。

例からわかるように、ブログのグループに同じユーザーを割り当てる必要があります。

ので、実装例は次のようになります。

users = Users.objects.filter(**somefilters) 
blogs = Blog.objects.filter(**another_filters) 

BlogUserRelation = Blog.users.through 

relations = [] 
for blog in blogs: 
    relations.extend([BlogUserRelation(
         user_id=user.id, 
         blog_id=blog.id 
        ) for user in users]) 

BlogUserRelation.objects.bulk_create(relations) 

これは、DBクエリの面で効率的であるが、メモリにすべてのオブジェクトをロードする必要があります。メモリを効率的にするには、何らかの種類のqueryset iteratorを使用し、チャンク上のブログオブジェクトをトラバースする必要があります。既存user-blog関係のblog.users.add(users)djangoチェックを使用する場合、通常は、念頭に置いており、それらを除外するための

もう一つ、bulk_createでこれがケースではありません、あなたはあなたが必要な場合は手動で行う必要があります。

関連する問題