Tuesday, July 4, 2017

Deprecating model field (Deleting model field, but keeping DB column)

I am having some trouble figuring out the best way to remove model fields in Django. If I remove a field from a model and then run makemigrations, it creates a RemoveField operation in a migration. That is great, but if I decide to run the migration before releasing the new code, the existing code will break (for a short time between running the migration and releasing the new code) because the old code is still querying for the removed column (Django queries for all columns by default). I could run the migration after the release, but that won't work if I also have an AddField operation because the new code needs the new column, so it needs to be run before. I am wondering if anyone has solved this issue?

My best solution (I don't think Django supports this) would be to have a special type of field called a DeprecatedField. It would delete the field from Django's perspective, but keep the column in the DB. Django would no longer query for the column, but the column would still be in the DB. On the next release, I could remove the column completely (with a RemoveField operation) and the existing code would not error because it has no knowledge of the column.

I noticed Django has an idea of a private field, which is on a model but not in the DB. Is there a way to create a field that is in the DB, but Django model doesn't query for it or allow it to be used in creates and updates? Very similar to the managed=False on the Model, but on the Field level. If anyone has other approaches to the problem, I would be very excited to find alternative methods.

Thanks,
Taylor

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/a52ae01a-1a7d-43ce-a94f-fb00c4e1b7d1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment