I wanted to ask about naming of the new method. Currently the proposed name 
is "QuerySet.bulk_save()" but I think it's a bit confusing since it uses 
QuerySet.update(), not Model.save(). It works similarly to 
QuerySet.bulk_update() from https://github.com/aykut/django-bulk-update but 
the arguments are a bit different.


Josh's comment on the PR: "Since this only works for instances with an pk, 
do you think that bulk_update would be a better name? The regular save() 
method can either create or update depending on pk status which may confuse 
users here."

And Tom's reply: "I considered this, but queryset.update() is the best 
'bulk update' method. I didn't want to confuse the two, this is more about 
saving multiple model fields with multiple differing values, gene bulk_save. 
Open to changing it though."


On Tuesday, January 23, 2018 at 7:38:18 AM UTC-5, Neal Todd wrote:
>
> Hi Tom,
>
> That's great, should be a helpful addition to core. Will follow the ticket 
> and PR.
>
> Neal
>
> (Apologies - I hadn't spotted that you'd already referenced 
> django-bulk-update in your ticket when I left my drive-by comment!)
>
> On Monday, January 22, 2018 at 7:41:11 PM UTC, Tom Forbes wrote:
>>
>> Hey Neal,
>>
>> Thank you very much for pointing that out, I actually found out about 
>> this package as I was researching the ticket - I wish I had known about 
>> this a couple of years ago as it would have saved me a fair bit of CPU and 
>> brain time!
>>
>> I think that module is a good starting point and proves that it’s 
>> possible, however I think the implementation can be improved upon if we 
>> bring it inside core. I worked on a small PR to add this 
>> <https://github.com/django/django/pull/9606/files#diff-5b0dda5eb9a242c15879dc9cd2121379R473>
>>  
>> and the implementation was refreshingly simple. It still needs docs, a 
>> couple more tests and to fix a strange error with sqlite on Windows, but 
>> overall it seems like a lot of gain for a small amount of code.
>>
>> Tom 
>>
>>
>> On 22 January 2018 at 15:10:53, Neal Todd (ne...@torchbox.com) wrote:
>>
>> Hi Tom,
>>
>> A built-in bulk save that's more flexible than update would certainly be 
>> nice. Just in case you haven't come across it though, there is a package 
>> called django-bulk-update:
>>
>> https://github.com/aykut/django-bulk-update
>>
>> I've found it very useful on a number of occassions where update isn't 
>> quite enough but the loop-edit-save pattern is too slow to be convenient.
>>
>> Probably some useful things in there when considering the API and 
>> approach.
>>
>> Cheers, Neal 
>>
>> On Friday, January 19, 2018 at 5:49:48 PM UTC, Tom Forbes wrote: 
>>>
>>> Hello all,
>>>
>>> I’d love for some feedback on an idea I’ve been mulling around lately, 
>>> namely adding a bulk_save method to Dango.
>>>
>>> A somewhat common pattern for some applications is to loop over a list 
>>> of models, set an attribute and call save on them. This unfortunately can 
>>> issue a lot of database queries which can be a significant slowdown. You 
>>> can work around this by using ‘.update()’ in some cases, but not all.
>>>
>>> It seems it would be possible to use a CASE statement in SQL to handle 
>>> bulk-updating many rows with differing values. For example:
>>>
>>> SomeModel.object.filter(id__in=[1,2]).update(
>>>     some_field=Case(
>>>         When(id=1, then=Value('Field value for ID=1')),
>>>         When(id=2, then=Value('Field value for ID=2'))
>>>     )
>>> )
>>>
>>> I’ve made a ticket for this here: 
>>> https://code.djangoproject.com/ticket/29037
>>>
>>> I managed to get a 70x performance increase using this technique on a 
>>> fairly large table, and it seems it could be applicable to many projects 
>>> just like bulk_create.
>>>
>>> The downsides to this is that it can produce very large SQL statements 
>>> when updating many rows (I had MySQL complain about a 10MB statement once), 
>>> but this can be overcome with batching and other optimisations (i.e the 
>>> same values can use WHEN id IN (x, y, z) rather than 3 individual WHEN 
>>> statements).
>>>
>>> I’m imagining an API very similar to bulk_create, but spend any time on 
>>> a patch I thought I would ask if anyone have any feedback on this 
>>> suggestion. Would this be a good addition to Dango?
>>>
>>>
>>> --
>> You received this message because you are subscribed to the Google Groups 
>> "Django developers (Contributions to Django itself)" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to django-develop...@googlegroups.com.
>> To post to this group, send email to django-d...@googlegroups.com.
>> Visit this group at https://groups.google.com/group/django-developers.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/django-developers/5988d579-7843-4c42-a6f9-1e389c58ece6%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/django-developers/5988d579-7843-4c42-a6f9-1e389c58ece6%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To post to this group, send email to django-developers@googlegroups.com.
Visit this group at https://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/5c77a802-40a5-4556-9b0b-13263e537d1b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to