Deprecate django fields and make migrations without breaking existing code.
Project description
django-deprecation
Deprecate django fields and make migrations without breaking existing code.
Install
pip install django-deprecation
Usage
Let's suppose we have the following models:
from django.db import models
class Musician(models.Model):
name = models.CharField(max_length=50)
class Album(models.Model):
musician = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
Now, for some reason, let's suppose we want to rename the field Album#musician
to Album#artist
.
So we make the migration using the RenameField operation. The problem is that any existing code that used the old field would break.
We could create a property as an alias:
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
@property
def musician(self):
return self.artist
@musician.setter
def musician(self, value):
self.artist = value
But any code using
QuerySet#filter
would break if it uses the musician
field.
This is where django-deprecation
comes handy.
We set the musician
field as a DeprecatedField
and point it to the artist
field:
from django_deprecation import DeprecatedField
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
musician = DeprecatedField('artist')
name = models.CharField(max_length=100)
Now, the following code snippet will work:
from .models import Album, Musician
album = Album.objects.first()
assert album.musician == album.artist
new_musician = Musician.objects.create(
first_name='John',
last_name='Doe',
instrument='Guitar',
)
album.musician = new_musician
assert album.artist == new_musician
new_musician_album = Album.objects.filter(
musician=new_musician,
).first()
new_artist_album = Album.objects.filter(
artist=new_musician,
).first()
assert new_musician_album == new_artist_album
If you want to control how to report the error,
replace the DeprecatedField.warn
function with a custom one:
from django_deprecation import DeprecatedField
def warn_function(message):
# do stuff
import warnings
warnings.warn(message, DeprecationWarning)
DeprecatedField.warn = warn_function
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_deprecation-0.1.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 089455e7a6a6fa34884222e9746adb8e875c11d3b7aa0a88c0f7e99dbd44484a |
|
MD5 | 9d378fd5c68315e8e8c0021a67b175cc |
|
BLAKE2b-256 | 8611baa0de99d09ec24b85283bb42a3387fe49fc28d3f796db9df2118e39aa0b |