#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.

Reply via email to