2016-07-15 2 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와 함께 당신은 당신이 필요로하는 경우 수동으로해야 할 때

한가지 더 일반적으로 염두에두고있다.

관련 문제