If we were to change the update signature from (**updates) to 
(updates=None, *, returning=None, **kwargs) the `returning` collision could 
be avoided by doing update({"foo": "bar"}, returning=["id", "foo"]) like 
Tom is suggesting.

I think that's the best option here if we want to elegantly add support for 
this feature while maintaining backward compability. Something along the 
lines of

def update(updates=None, *, returning=None, **kwargs):
    if updates and kwargs:
        raise TypeError('updates must be either specified through the first 
positional argument or kwargs')
    if updates is None:
        updates = kwargs
    ...

I guess we could force the usage of positional `updates` if `returning` is 
specified to prevent any silent breakages as well.

The usage of `returning` bring another set of questions though. Since 
UPDATE are not ordered RETURNING data has little value without the primary 
key associated with the updated rows. Maybe the return value of 
`returning=[f1, ..., fn]` should be a dict mapping the primary key to list 
of returning values.

e.g.

Post.objects.create(id=1, score=41)
Post.objects.update({"score": F("score") + 1}, returning=["score"])
-> {1: [42]}

Cheers,
Simon

Le mardi 26 janvier 2021 à 12:36:10 UTC-5, f.apo...@gmail.com a écrit :

> On Tuesday, January 26, 2021 at 5:26:02 PM UTC+1 Adam Johnson wrote:
>
>> Not that I am completely convinced that the following is a good idea; but 
>>> what about: 
>>
>> QuerySet.objects.update(name="Rob").values("id", "name")
>>>
>>
>> That's not possible since update() directly performs the update - it's 
>> not lazy in any way. It could be done in the other order like 
>> `QuerySet.objects.values("id", "name").update(name="Rob")` but I don't see 
>> the necessity to define "returning" fields in a chainable manner.
>>
>
> Ha, not sure what I was thinking. The sentence below I noted that update() 
> would return something but I didn't think that this would break chaining. 
> My bad.
>
> I looked further around and `get_or_create` has the nice workaround of 
> being able to use `defaults__exact` if it clashes with the `defaults` 
> keyword. Sadly we do not have that option here. Truth to be told I do not 
> think that many people have fields called returning
>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/86210b9b-4978-4068-ac61-f1a3061bf2a4n%40googlegroups.com.

Reply via email to