Opened 22 months ago

Closed 22 months ago

Last modified 22 months ago

#33834 closed New feature (duplicate)

Compact way to in-place update of the ORM model instance

Reported by: Anton Danilchenko Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords: orm
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Hello,

I think that it will be useful to have such a methods to update the instance in-place, that saves a bit of typing:

book = Book.objects.get(pk=123)

# Currently we do next
book.title = "New title"
book.year = 2022
book.save()

# NEW WAY: Set multiple fields in-place
book.set(title="New title", year=2022)
book.save()

# NEW WAY: Update multiple fields in-place
book.update(title="New title", year=2022)

This way we can save on typing, and set fields (especially if we have them in a dict) easily. Or we can update an object with new field values and save it explicitly.

It can be implemented easily in the base Model class by adding two methods:

class Model:
    def set(self, **kwargs):
        for name, value ink wargs.items():
            setattr(name, value)

    def update(self, **kwargs):
        self.set(kwargs)
        return self.save()

My question is next - why it's no such obvious operations in the Django ORM yet? Is it done by purpose?

Change History (3)

comment:1 by Mariusz Felisiak, 22 months ago

Resolution: duplicate
Status: newclosed
Type: Cleanup/optimizationNew feature

Duplicate of #3182.

comment:2 by Anton Danilchenko, 22 months ago

Hi @Mariusz Felisiak.

I see that you marked it as a duplicate of the very old ticket. But in that ticket it was discussed a different approach - to use the queriet.update() method to update one or few objects at the same time, and it was rejected in the end.

But I'm asking about a totally different approach - to use the instance.update() as a shorter form of what I described above. It's a different approach, but method name is the same in both tickets, but meaning is totally different.

Please re-evaluate this ticket one more time.

comment:3 by Mariusz Felisiak, 22 months ago

It's exactly the same. It's titled "model instance update() method and ..." and was rejected by Jacob:

It's pretty clear to me that update() is a nonstarter; it's a single line of code::

def update(self, **kw):
    self.objects.filter(pk=self.pk).update(**kw)
Note: See TracTickets for help on using tickets.
Back to Top