不推荐django字段,并在不破坏现有代码的情况下进行迁移。

django-deprecation的Python项目详细描述


Django折旧

build statuscoveragePyPI versionpython versiondjango version

不推荐Django字段,并在不破坏现有代码的情况下进行迁移。

安装

pip install django-deprecation

用法

tl;dr

# Before:classAlbum(models.Model):name=models.CharField(max_length=50)# After:classAlbum(models.Model):name=DeprecatedField('title')title=models.CharField(max_length=50)assertalbum.name==album.titleassertlist(Album.objects.filter(name='foo'))==list(Album.objects.filter(title='foo'))

详细说明

假设我们有以下型号:

fromdjango.dbimportmodelsclassMusician(models.Model):name=models.CharField(max_length=50)classAlbum(models.Model):musician=models.ForeignKey(Musician,on_delete=models.CASCADE)name=models.CharField(max_length=100)

现在,出于某种原因,假设我们想将字段Album#musician重命名为Album#artist

所以我们使用 RenameField 操作。问题是,使用旧字段的任何现有代码都会被破解。

我们可以创建一个属性作为别名:

classAlbum(models.Model):artist=models.ForeignKey(Musician,on_delete=models.CASCADE)name=models.CharField(max_length=100)@propertydefmusician(self):returnself.artist@musician.setterdefmusician(self,value):self.artist=value

但是任何使用 QuerySet#filter 如果使用musician字段,则会中断。

这就是django-deprecation有用的地方。 我们将musician字段设置为DeprecatedField,并将其指向artist字段:

fromdjango_deprecationimportDeprecatedFieldclassAlbum(models.Model):artist=models.ForeignKey(Musician,on_delete=models.CASCADE)musician=DeprecatedField('artist')name=models.CharField(max_length=100)

现在,下面的代码片段将起作用:

from.modelsimportAlbum,Musicianalbum=Album.objects.first()assertalbum.musician==album.artistnew_musician=Musician.objects.create(first_name='John',last_name='Doe',instrument='Guitar',)album.musician=new_musicianassertalbum.artist==new_musiciannew_musician_album=Album.objects.filter(musician=new_musician,).first()new_artist_album=Album.objects.filter(artist=new_musician,).first()assertnew_musician_album==new_artist_album

如果要控制如何报告错误, 用自定义函数替换DeprecatedField.warn函数:

fromdjango_deprecationimportDeprecatedFielddefwarn_function(message):# do stuffimportwarningswarnings.warn(message,DeprecationWarning)DeprecatedField.warn=warn_function

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何编写一个程序,返回一个字符串在另一个字符串中出现的次数?   @ManyToOne中的java JPA@ManyToOne无法正常工作   方法在Java中显示Eclipse中的错误,使用Maven可以很好地构建   在java中如何逆时针旋转此数组?   Java中关于日历的一个场景,其中显式设置日期会导致不同的结果   spring boot Java在BeanPropertyRowMapper上对ArrayList的缓慢SQL检索<accountQueryResult>   给出nullpointer异常的java回调方法   java对独立的arraylist元素执行算术运算   使用DropWizard对动态模式进行java JSON解析   双Java双十进制差分   带索引参数的链表java迭代器   JavaLocalDate(反)序列化可以在JAXRS服务器中工作,但不能在JAXRX客户端中工作   java请求一个整数