Opened 12 years ago
Closed 12 years ago
#19676 closed Bug (fixed)
Inspectdb ForeignKey for self
Reported by: | Georgy Kutsurua | Owned by: | Simon Charette |
---|---|---|---|
Component: | Uncategorized | Version: | dev |
Severity: | Normal | Keywords: | inspectdb foreignkey |
Cc: | Georgy Kutsurua | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Inspectdb command generate ForeignKey string
parent = models.ForeignKey(''self'', null=True, blank=True)
it is uncorrectly, we needed
parent = models.ForeignKey('self', null=True, blank=True)
here we use one quote instead double quote :)
Attachments (2)
Change History (12)
comment:1 by , 12 years ago
Cc: | added |
---|
comment:2 by , 12 years ago
Triage Stage: | Unreviewed → Accepted |
---|---|
Version: | 1.5-beta-1 → master |
comment:3 by , 12 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:4 by , 12 years ago
I think I found another bug while debugging this, SQLite supposedly can_introspect_foreign_keys
but fails with recursive ones.
EDIT:
Actually REFERENCES
clauses are not added on model creation.
by , 12 years ago
Attachment: | 0001-Fixed-19676-Avoid-quoting-recursive-ForeignKey-targe.patch added |
---|
comment:5 by , 12 years ago
Has patch: | set |
---|
comment:6 by , 12 years ago
Attached a patch that passes on Python 2.7.3 and 3.2.3 SQLite. It requires the fix for #19677 to pass on SQLite.
comment:7 by , 12 years ago
Although the patch looks good, the test fails on SQLite for me — the FK isn't detected and the output contains parent_id = models.IntegerField()
.
(django-dev)myk@mYk tests % PYTHONPATH=.. python runtests.py --settings=test_sqlite inspectdb Creating test database for alias 'default'... Creating test database for alias 'other'... F... ====================================================================== FAIL: test_attribute_name_not_python_keyword (regressiontests.inspectdb.tests.InspectDBTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/myk/Documents/dev/django/django/test/testcases.py", line 873, in skip_wrapper return test_func(*args, **kwargs) File "/Users/myk/Documents/dev/django/tests/regressiontests/inspectdb/tests.py", line 35, in test_attribute_name_not_python_keyword self.assertIn("parent = models.ForeignKey('self')", output) AssertionError: u"parent = models.ForeignKey('self')" not found in "# This is an auto-generated Django model module.\n# You'll have to do the following manually to clean this up:\n# * Rearrange models' order\n# * Make sure each model has one field with primary_key=True\n# Feel free to rename the models, but don't rename db_table values or field names.\n#\n# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'\n# into your database.\nfrom __future__ import unicode_literals\n\nfrom django.db import models\n\nclass InspectdbDigitsincolumnname(models.Model):\n id = models.IntegerField(primary_key=True)\n number_123 = models.CharField(max_length=11, db_column='123') # Field renamed because it wasn't a valid Python identifier.\n number_4extra = models.CharField(max_length=11, db_column='4extra') # Field renamed because it wasn't a valid Python identifier.\n number_45extra = models.CharField(max_length=11, db_column='45extra') # Field renamed because it wasn't a valid Python identifier.\n class Meta:\n db_table = 'inspectdb_digitsincolumnname'\n\nclass InspectdbMessage(models.Model):\n id = models.IntegerField(primary_key=True)\n from_field = models.ForeignKey('InspectdbPeople', db_column='from_id') # Field renamed because it was a Python reserved word.\n class Meta:\n db_table = 'inspectdb_message'\n\nclass InspectdbPeople(models.Model):\n id = models.IntegerField(primary_key=True)\n name = models.CharField(max_length=255)\n parent_id = models.IntegerField()\n class Meta:\n db_table = 'inspectdb_people'\n\nclass InspectdbPeopledata(models.Model):\n people_pk = models.ForeignKey(InspectdbPeople, primary_key=True)\n ssn = models.CharField(max_length=11)\n class Meta:\n db_table = 'inspectdb_peopledata'\n\nclass InspectdbPeoplemoredata(models.Model):\n id = models.IntegerField(primary_key=True)\n people_unique = models.ForeignKey(InspectdbPeople, unique=True)\n license = models.CharField(max_length=255)\n class Meta:\n db_table = 'inspectdb_peoplemoredata'\n\nclass InspectdbSpecialcolumnname(models.Model):\n id = models.IntegerField(primary_key=True)\n field = models.IntegerField()\n field_field = models.IntegerField(db_column='Field_') # Field name made lowercase. Field renamed because it ended with '_'.\n field_field_0 = models.IntegerField(db_column='Field__') # Field name made lowercase. Field renamed because it contained more than one '_' in a row. Field renamed because it ended with '_'. Field renamed because of name conflict.\n field_field_1 = models.IntegerField(db_column='__field') # Field renamed because it contained more than one '_' in a row. Field renamed because it started with '_'. Field renamed because of name conflict.\n prc_x = models.IntegerField(db_column='prc(%) x') # Field renamed to remove unsuitable characters.\n class Meta:\n db_table = 'inspectdb_specialcolumnname'\n\n" ---------------------------------------------------------------------- Ran 4 tests in 0.021s FAILED (failures=1) Destroying test database for alias 'default'... Destroying test database for alias 'other'...
by , 12 years ago
Attachment: | 19676-2.patch added |
---|
comment:8 by , 12 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|---|
Patch needs improvement: | set |
Patch updated with a small stylistic improvement.
comment:9 by , 12 years ago
Component: | Database layer (models, ORM) → Uncategorized |
---|---|
Patch needs improvement: | unset |
It requires the fix for #19677 to pass on SQLite.
comment:10 by , 12 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Managed to reproduce on postgresql (which supports db fks).