Opened 12 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
.