Opened 13 years ago
Closed 13 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 , 13 years ago
| Cc: | added |
|---|
comment:2 by , 13 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|---|
| Version: | 1.5-beta-1 → master |
comment:3 by , 13 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:4 by , 13 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 , 13 years ago
| Attachment: | 0001-Fixed-19676-Avoid-quoting-recursive-ForeignKey-targe.patch added |
|---|
comment:5 by , 13 years ago
| Has patch: | set |
|---|
comment:6 by , 13 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 , 13 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 , 13 years ago
| Attachment: | 19676-2.patch added |
|---|
comment:8 by , 13 years ago
| Component: | Uncategorized → Database layer (models, ORM) |
|---|---|
| Patch needs improvement: | set |
Patch updated with a small stylistic improvement.
comment:9 by , 13 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 , 13 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Managed to reproduce on postgresql (which supports db fks).