Django restframework 嵌套关系处理
场景:带有外键的model,且是始终一对一创建的关系。
model.py:
class Album(models.Model): album_name = models.CharField(verbose_name=u'名称', max_length=100) artist = models.CharField(max_length=100) class Meta: db_table = 'album' verbose_name = u'album表' class Track(models.Model): album = models.ForeignKey(Album, related_name='tracks') order = models.IntegerField() title = models.CharField(max_length=100) duration = models.IntegerField() class Meta: db_table = 'track'
序列化serializer.py如下:
class AlbumSerializer(serializers.ModelSerializer): class Meta: model = Album fields = ('id', 'album_name', 'artist') class TrackSerializer(serializers.ModelSerializer): album = AlbumSerializer() class Meta: model = Track fields = ('id', 'order', 'title', 'duration', 'album') depth = 1 def create(self, validated_data): print validated_data album_data = validated_data.pop('album') album = Album.objects.create(**album_data) validated_data['album'] = album track = Track.objects.create(**validated_data) return track
这里有四点需要注意:
1、album = AlbumSerializer() 表示Album里的字段为必填,若不是必填required=False
2、如果嵌套表示应该是项列表,则应将该many=True
标志传递给嵌套序列化
3、create()、update()方法必须重写。默认值ModelSerializer
.create()
和.update()
方法不包括对可写嵌套表示的支持。
4、参数的组装形式如下:
{ "order": null, "title": "", "duration": null, "album": { "album_name": "", "artist": "" } }
views.py:
class AlbumViewSet(viewsets.ModelViewSet): queryset = Album.objects.all() serializer_class = AlbumSerializer class TrackViewSet(viewsets.ModelViewSet): queryset = Track.objects.all() serializer_class = TrackSerializer
urls.py:
router = routers.DefaultRouter(trailing_slash=True) router.register(r'album', views.AlbumViewSet, base_name='album') router.register(r'track', views.TrackViewSet, base_name='track')
运行:http://127.0.0.1:8000/track/,页面如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具