#13212 closed (duplicate)
get_or_create() does not respect to_field setting
Reported by: | cheerios | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.1 |
Severity: | Keywords: | to_field, get_or_create, relation | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
A model with a ForeignKey defining a to_field always results in a new record creation with get_or_create(), as the to_field -setting for is ignored and the initial SELECT uses ForeignKey's primary_key. The Field defined with to_field does not even have the same Field -type (IntegerField looked up against CharField).
from django.db import models import uuid class UniqueField(models.CharField): def pre_save(self, model_instance, add): value = getattr(model_instance, self.attname, None) if not value: value = unicode(uuid.uuid1()) setattr(model_instance, self.attname, value) return value class Base(models.Model): pub_date = models.DateTimeField(auto_now_add=True) class Meta: abstract = True class Sun(Base): unique = UniqueField(max_length=36, editable=False, null=False, blank=False, unique=True) class Dae(models.Model): pub_date = models.DateTimeField(auto_now_add=True) sun = models.ForeignKey(Sun, blank=True, null=True, to_field='unique')
sun = Sun() sun.save() dae = Dae.objects.get_or_create(sun=sun) SELECT `main_dae`.`id`, `main_dae`.`pub_date`, `main_dae`.`sun_id` FROM `main_dae` WHERE `main_dae`.`sun_id` = 1 # (!) using primary_key value, should be using to_field='unique'! INSERT INTO `main_dae` (`pub_date`, `sun_id`) VALUES ('2010-03-25 20:55:36', 'b655a54e-3850-11df-b6cc-001b11b72424') dae = Dae.objects.get_or_create(sun=sun) SELECT `main_dae`.`id`, `main_dae`.`pub_date`, `main_dae`.`sun_id` FROM `main_dae` WHERE `main_dae`.`sun_id` = 1 # (!) using primary_key value, should be using to_field='unique'! INSERT INTO `main_dae` (`pub_date`, `sun_id`) VALUES ('2010-03-25 20:55:36', 'b655a54e-3850-11df-b6cc-001b11b72424') # (!) this record should never get created with correct selects
Note:
See TracTickets
for help on using tickets.
I believe the root problem here is #11319.