This snippet parses the output file of inspectdb and does some alterations. Mostly useful for people who regenerates models from constantly changing legacy databases.
The snippet will:
*Add quotes around foreign key classes, so the ordering is not significant
*Append a related_name property to each foreign key with the value model class name + db_column name to evade collisions in reverse queries like:
example.model: Reverse query name for field 'foreignkey' clashes with related field 'model2.foreignkey'. Add a related_name argument to the definition for 'foreignkey'.
There's a slight performance degradation with using quotes class name instead of passing the class though.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import fileinput
import re
import sys
active_model = ""
for line in fileinput.input():
if active_model == "" and not line.startswith("class"):
sys.stdout.write(line)
continue
if line.startswith("#"):
sys.stdout.write(line)
continue
if line.startswith("class"):
active_model = re.findall("class\ (.*)\(models.Model\):", line)[0]
sys.stdout.write(line)
continue
if "models.ForeignKey" in line:
line = re.sub("ForeignKey\((.*),", "ForeignKey('\\1',", line)
line = re.sub("''self''", "'self'", line)
db_column = re.findall("db_column='(.*)'", line)[0]
line = re.sub("\)$", ", related_name='%s_%s')" % (active_model.lower(), db_column), line)
sys.stdout.write(line)
continue
sys.stdout.write(line)
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 2 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 2 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 9 months, 2 weeks ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 10 months, 1 week ago
- Help text hyperlinks by sa2812 11 months ago
Comments
Nice idea, but it doesn't work in all cases. In particular it seems to fail in two ways for ForeignKey tables where the primary key ends in _id. Needs better re parsing.
#
Please login first before commenting.