Login

Another means of updating a subset of a model's fields

Author:
insin
Posted:
November 23, 2007
Language:
Python
Version:
.96
Score:
2 (after 2 ratings)

Based on the UPDATE query section of Model.save(), this is another means of limiting the fields which are used in an UPDATE statement and bypassing the check for object existence which is made when you use Model.save().

Just make whatever changes you want to your model instance and call update, passing your instance and the names of any fields to be updated.

Usage example:

import datetime

from forum.models import Topic
from forum.utils.models import update

topic = Topic.objects.get(pk=1)
topic.post_count += 1
topic.last_post_at = datetime.datetime.now()
update(topic, 'post_count', 'last_post_at')

(Originally intended as a comment on Snippet 479, but comments aren't working for me)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from django.db import connection, transaction

def update(model_instance, *args):
    """
    Updates only specified fields of the given model instance.
    """
    opts = model_instance._meta
    fields = [opts.get_field(f) for f in args]
    db_values = [f.get_db_prep_save(f.pre_save(model_instance, False)) for f in fields]
    if db_values:
        connection.cursor().execute("UPDATE %s SET %s WHERE %s=%%s" % \
            (connection.ops.quote_name(opts.db_table),
             ','.join(['%s=%%s' % connection.ops.quote_name(f.column) for f in fields]),
             connection.ops.quote_name(opts.pk.column)),
             db_values + opts.pk.get_db_prep_lookup('exact', model_instance.pk))
        transaction.commit_unless_managed()

More like this

  1. Stuff by NixonDash 1 month ago
  2. Add custom fields to the built-in Group model by jmoppel 3 months, 1 week ago
  3. Month / Year SelectDateWidget based on django SelectDateWidget by pierreben 6 months, 3 weeks ago
  4. Python Django CRUD Example Tutorial by tuts_station 7 months, 1 week ago
  5. Browser-native date input field by kytta 8 months, 3 weeks ago

Comments

Please login first before commenting.