Django修改Models后重建数据库及DRF多模型序列化实战

Dylan
Dylan
发布时间:2026-10-13 | 4人浏览过
原创

本文详解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多模型序列化的内容就是小编分享给大家的全部信息,希望能对大家有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表