#27419: Model that worked before 1.10 causes "Cannot force an update in save() with no primary key." in 1.10. -------------------------------------+------------------------------------- Reporter: Louis- | Owner: nobody Dominique Dubeau | Type: Bug | Status: new Component: Database | Version: 1.10 layer (models, ORM) | Severity: Normal | Keywords: save model property Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- This problem does not happen prior to Django 1.10. I'm running this on Python 2.7.12 but I don't think the Python version is an issue. The following case is distilled form a full-fledged application that has run fine in production since Django 1.6. Upon upgrading to 1.10, I immediately got the error reported here.
Consider the following models.py file: {{{ from __future__ import unicode_literals from django.db import models class Foo(models.Model): a = models.CharField(max_length=10) b = models.CharField(max_length=10) parent = models.ForeignKey( "self", related_name="children", null=True, blank=True) class Bar(models.Model): a = models.CharField(max_length=10) _b = models.CharField(max_length=10, name="b", db_column="b") parent = models.ForeignKey( "self", related_name="children", null=True, blank=True) @property def b(self): return self._b @b.setter def b(self, val): print "SETTING B" # This would make the problem disappear: # self.__dict__["b"] = val self._b = val }}} And the following tests.py file which is a sibling to models.py above: {{{ from django.test import TestCase from .models import * class TestFoo(TestCase): def test(self): parent = Foo(a="parent_a", b="parent_b") parent.save() foo = Foo(a="1a", b="1b", parent=parent) foo.save() class TestBar(TestCase): def test(self): parent = Bar(a="parent_a", b="parent_b") parent.save() bar = Bar(a="1a", b="1b", parent=parent) bar.save() }}} Running `./manage.py test` results in: {{{ $ ./manage.py test Creating test database for alias 'default'... SETTING B SETTING B E. ====================================================================== ERROR: test (myapp.tests.TestBar) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/ldd/src/django_issues/deferred_fields_in_1.10/issue/myapp/tests.py", line 19, in test bar.save() File "/home/ldd/src/django_issues/deferred_fields_in_1.10/issue- venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 796, in save force_update=force_update, update_fields=update_fields) File "/home/ldd/src/django_issues/deferred_fields_in_1.10/issue- venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 824, in save_base updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "/home/ldd/src/django_issues/deferred_fields_in_1.10/issue- venv/local/lib/python2.7/site-packages/django/db/models/base.py", line 880, in _save_table raise ValueError("Cannot force an update in save() with no primary key.") ValueError: Cannot force an update in save() with no primary key. ---------------------------------------------------------------------- Ran 2 tests in 0.002s FAILED (errors=1) Destroying test database for alias 'default'... }}} If I downgrade to Django 1.9, I get: {{{ $ ./manage.py test Creating test database for alias 'default'... SETTING B SETTING B .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK Destroying test database for alias 'default'... }}} -- Ticket URL: <https://code.djangoproject.com/ticket/27419> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/046.917154e7b172ddfb322e540ce2921c01%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.