Opened 8 years ago

Last modified 8 years ago

#26638 closed New feature

Allow callable in defaults argument for QuerySet.get_or_create — at Initial Version

Reported by: Maxime Lorant Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords:
Cc: Will Koster Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: yes UI/UX: no

Description

It would be nice if get_or_create handles callable in the defaults parameter so the defaults value are not computed at each selection. Indeed, if your default values for insertion contains selection of related object or any long computation, it is done at each call, even if the object can be retrieved without insertion (and so the defaults parameter is not used).

In term of code, I would like to do something like this:

SomeObject.objects.get_or_create(
       key1=value1, 
       key2=value2,
       defaults={
             'key3': long_processing_to_get_default(),
             # or even
             'key3': lambda: OtherModel.objects.get(pk=request.some_value)
       }
)

For backward-compatibility and ease of writing, it should still accept values that are not callables. See the patch attached (unit tests are missing so it is not complete!)

Change History (1)

by Maxime Lorant, 8 years ago

Attachment: patch26638.txt added
Note: See TracTickets for help on using tickets.
Back to Top