Opened 11 years ago

Last modified 9 years ago

#20154 closed Bug

Inconsistent model save behavior when assigning model instances to CharFields — at Initial Version

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

Description

Hi,

When I assign a model instance to a CharField on a model and save the instance, it gets saved as the string representation of the instance on insert, but as the string representation of the instance's pk on update.

from django.db import models

class Country(models.Model):
  name = models.CharField(max_length=100)
  def __unicode__(self):
    return name

class Address(models.Model):
  country = models.CharField(max_length=100)
>>> c = Country.objects.get(name='Sweden')
>>> a = Address.objects.create(country=c)
>>> Address.objects.get(pk=a.pk).country
>>> u'Sweden'
>>> a.save()
>>> Address.objects.get(pk=a.pk).country
>>> '1'

I do realize I should assign c.name instead if c, but it feels like a bug to treat values differently on insert vs update.

The reason seems to be that SQLUpdateCompiler.as_sql preps the value using val.prepare_database_save if available, whereas SQLInsertCompiler.as_sql always uses field.get_db_prep_save.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top