Opened 3 years ago

Last modified 4 weeks ago

#25195 new New feature

update_or_create doesn't understand F() operations

Reported by: Marc Tamlyn Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This may not be possible to resolve, but it would be really nice if you could do something like

Foo.objects.update_or_create(name='bar', defaults={'value': F('value') + 1})

This would only be possible when value has a default, and we would need to resolve the F() object to the default. It may be that we need a different object which resolves to an expression when used in an update but resolves differently when used in a create.

Change History (3)

comment:1 Changed 3 years ago by Tim Graham

Triage Stage: UnreviewedAccepted

comment:2 Changed 4 weeks ago by Marc Parizeau

How about the following?

Foo.objects.update_or_create(name='bar', defaults={'value': Coalesce('value', 0) + 1})

where one could specify an explicit default?

comment:3 in reply to:  2 Changed 4 weeks ago by Simon Charette

Replying to Marc Parizeau:

How about the following?

Foo.objects.update_or_create(name='bar', defaults={'value': Coalesce('value', 0) + 1})

where one could specify an explicit default?

We'd need to special case Coalesce in update_or_create for this to work as references to columns are not allowed in INSERTs. In other words, Coalesce('value', 0) + 1 exhibits the same limitations that F('value') + 1 has in create.

Last edited 4 weeks ago by Simon Charette (previous) (diff)
Note: See TracTickets for help on using tickets.
Back to Top