﻿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
18081	Syncdb doesn't create database constraints for foreign keys referencing a proxy model.	Anssi Kääriäinen	nobody	"Add this test to modeltests/proxy_models/tests.py:
{{{
class TransactionalProxyModelTests(TransactionTestCase):
    def test_proxy_fk(self):
        """"""
        Test that the DB contains proper foreign keys for proxy model references.
        """"""
        @transaction.commit_on_success
        def create_failing_pk():
            t = TrackerUser.objects.create(status='bar')
            Improvement.objects.create(summary='foof', version='foof',
                                       reporter_id=1, associated_bug_id=1,
                                       assignee=t)
        self.assertRaises(IntegrityError, create_failing_pk)

}}}
On MySQL this does not fail when using InnoDB. It should fail, as both reporter and associated bug with ID=1 are missing.

The reason for this is that in django/db/backends/creation.py, sql_for_pending_references() is a check:
{{{ if not model._meta.managed or model._meta.proxy: skip creation }}}
Now, that is incorrect: the model in question is the model we are _referring_, not the model from where the PK is from. So, under MySQL foreign keys to proxy models do not get enforced in the DB.

In addition the same bug is there for other databases, too. However, this one does not show under PostgreSQL as the foreign key is created inline. However, were the order of the models different in models.py also PostgreSQL would fail to create the foreign key.

The fix is luckily very simple: just remove the ""or proxy"" part. The managed part is correct: the referenced model can be a view for example, in which case referencing it would be a failure."	Bug	closed	Database layer (models, ORM)	1.4	Normal	fixed		Simon Charette	Accepted	0	0	0	0	0	0
