﻿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
29896	Regression when saving a ForeignKey with to_field attr. Cached model is lost.	Maciej Gol	nobody	"Hey guys, during recent patching run I've encountered regression between Django 2.0.9 and 2.1.2.

Given models:

{{{
class Author(models.Model):
    username = models.CharField(primary_key=True)
    numeric_id = models.AutoField()

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    author_numeric = models.ForeignKey(Author, on_delete=models.CASCADE, to_field=""numeric_id"")
}}}

The following test fails, although it shouldn't.

{{{
class SomeTest(TestCase):
    def test_foreign_key_with_to_field_should_properly_persist_through_save(self):
        author = Author.objects.create(username=""yada"")
        book = Book(author=author, author_numeric=author)
        book.save()

        with self.assertNumQueries(0):
            book.author_numeric  # No queries below Django 2.1. One query for Django 2.1.
}}}

The problem comes from the `save()` method here:

{{{
                # If the relationship's pk was changed, clear the cached
                # relationship.
                if obj and obj.pk != getattr(self, field.attname):
                    field.delete_cached_value(self)
}}}

We compare `obj.pk` with `book.author_numeric_id`, but `pk` is a string (`username`) and `author_numeric_id` is an integer. It should look for `to_field` value, instead:

{{{
                # If the relationship's pk was changed, clear the cached
                # relationship.
                if obj and getattr(obj, field.target_field.attname) != getattr(self, field.attname):
                    field.delete_cached_value(self)
}}}"	Bug	new	Database layer (models, ORM)	2.1	Normal				Unreviewed	0	0	0	0	0	0
