#18081: Proxy model foreign keys not created properly by syncdb
----------------------------------------------+--------------------
Reporter: akaariai | Owner: nobody
Type: Bug | Status: new
Component: Database layer (models, ORM) | Version: 1.4
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------------------+--------------------
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/18081>
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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.