﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
27419	"Model that worked before 1.10 causes ""Cannot force an update in save() with no primary key."" in 1.10."	Louis-Dominique Dubeau	nobody	"
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'...
}}}
"	Bug	closed	Database layer (models, ORM)	1.10	Normal	needsinfo	save model property		Unreviewed	0	0	0	0	0	0
