Django修改Models后重建数据库及DRF多模型序列化实战
本文详解Django修改Models后执行makemigrations报错的解决方法,包括指定迁移名称以区分多次变更。同时介绍如何使用django-rest-multiple-models库在DRF中一次性序列化多个Model数据,并演示如何配置自定义分页以优化JSON输出效果。
Django修改Models后重建数据库的报错与解决
在第二次修改models.py之后,需要再次执行迁移命令。
python manage.py makemigrations
执行后系统提示如下错误信息:
You are trying to add a non-nullable field 'address' to xc_users without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Qu
尝试删除数据库表后,继续执行操作仍报相同的错误。
makemigrations命令需要指定具体的迁移名称,这样migrate才能正确识别并处理两次makemigrations之间的差异。
python manage.py makemigrations --name sqlname
随后,再执行以下命令:
python manage.py migrate
此时成功解决了该问题。
DRF一次性序列化多个Model数据
补充知识:在Django REST Framework中,如何一次性序列化同一个数据库下的多个Model表数据,并将结果合并到一个JSON页面中。
在Django项目中,首先需要安装django-rest-multiple-models库。
pip install django-rest-multiple-models
接着,在settings配置文件中注册该APP。
INSTALLED_APPS = (
....
'drf_multiple_model',
)
在views视图函数中引入相关类。
from drf_multiple_model.views import ObjectMultipleModelAPIView
假设有如下两个模型定义。
class Play(models.Model):
genre = models.CharField(max_length=100)
title = models.CharField(max_length=200)
pages = models.IntegerField()
class Poem(models.Model):
title = models.CharField(max_length=200)
style = models.CharField(max_length=100)
lines = models.IntegerField()
stanzas = models.IntegerField()
对应的序列化器定义如下。
class PlaySerializer(serializers.ModelSerializer):
class Meta:
model = Play
fields = ('genre','title','pages')
class PoemSerializer(serializers.ModelSerializer):
class Meta:
model = Poem
fields = ('title','stanzas')
在views中,我们可以继承ObjectMultipleModelAPIView类来实现。
from drf_multiple_model.views import ObjectMultipleModelAPIView
class TextAPIView(ObjectMultipleModelAPIView):
querylist = [
{'queryset': Play.objects.all(), 'serializer_class': PlaySerializer},
{'queryset': Poem.objects.filter(style='Sonnet'), 'serializer_class': PoemSerializer},
....
]
如果使用的URL配置是router,则应该继承ObjectMultipleModelAPIViewSet。
具体的引入方式如下。
from drf_multiple_model.viewsets import ObjectMultipleModelAPIViewSet
DRF页面的最终显示效果如下所示。
{
"Play" : [
{"genre": "Comedy", "title": "A Midsummer Night"s Dream", "pages": 350},
{"genre": "Tragedy", "title": "Romeo and Juliet", "pages": 300},
....
],
"Poem" : [
{"title": "Shall I compare thee to a summer"s day", "stanzas": 1},
{"title": "As a decrepit father takes delight", "stanzas": 1},
....
],
}
其效果是能够在单一的JSON页面下,序列化出多个不同的Model数据。
配置多模型数据分页
此外,我们还可以对每个表的数据进行分页处理。
from drf_multiple_model.pagination import MultipleModelLimitOffsetPagination
在views中可以这样编写分页逻辑。
class LimitPagination(MultipleModelLimitOffsetPagination): default_limit = 10
这表示每个Model默认显示前十条数据。
如果前端有特定需求,可以在URL参数中加上limit=5,以自定义默认显示前五条数据。
更多详细内容,可以访问GitHub搜索DjangoRestMultipleModels获取文档。
以上关于Django修改Models重建数据库的操作及DRF多模型序列化的内容就是小编分享给大家的全部信息,希望能对大家有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













