#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 django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to