基于Angular 6与DRF的求职网站:JSON数组序列化存储问询
在Django REST Framework中处理
interests数组字段的正确序列化写法 嘿,刚好之前做过类似的求职申请系统,给你梳理下DRF里处理这个interests字符串数组字段的正确姿势:
第一步:先搞定模型层的存储
根据你用的数据库不同,有两种常用的存储方案:
- 如果是PostgreSQL数据库,最贴合的是用
ArrayField专门存储字符串数组,这是PostgreSQL的原生支持,操作起来最方便:
from django.db import models from django.contrib.postgres.fields import ArrayField class JobApplication(models.Model): firstname = models.CharField(max_length=100) lastname = models.CharField(max_length=100) # 存储字符串数组,默认值设为空数组 interests = ArrayField(models.CharField(max_length=100), default=list) # 其他求职相关字段(比如邮箱、简历链接等)...
- 如果是MySQL、SQLite这类通用数据库,用
JSONField来存储数组格式的数据就可以了,Django会自动帮你处理JSON的序列化和反序列化:
from django.db import models class JobApplication(models.Model): firstname = models.CharField(max_length=100) lastname = models.CharField(max_length=100) # 用JSONField存数组,默认空数组 interests = models.JSONField(default=list) # 其他字段...
第二步:配置DRF序列化器
这是核心步骤,你需要用DRF的ListField配合CharField来定义这个字段,这样就能完美解析前端传来的interests数组,同时把数据库里的数据序列化为JSON数组返回:
from rest_framework import serializers from .models import JobApplication class JobApplicationSerializer(serializers.ModelSerializer): # 明确指定interests是由字符串组成的数组 interests = serializers.ListField( child=serializers.CharField(max_length=100) ) class Meta: model = JobApplication # 把需要序列化的字段都列在这里 fields = ['firstname', 'lastname', 'interests', ...]
第三步:验证效果
现在当你的Angular前端提交这样的JSON数据时:
{ "firstname": "Firstname", "lastname": "Lastname", "interests": ["hobby1", "hobby2", "hobby3", "hobby4"] }
DRF会自动验证每个interests元素都是符合长度要求的字符串,然后正确存储到数据库里。反过来,当你查询这条申请记录时,序列化器也会把数据库里的数组转化为标准JSON数组返回给前端,完全匹配你的需求。
额外优化提示
- 如果需要限制
interests的可选值(比如只能选预设的兴趣标签),可以把child换成ChoiceField:
interests = serializers.ListField( child=serializers.ChoiceField(choices=[('coding', '编程'), ('reading', '阅读'), ('sports', '运动')]) )
- 如果前端可能传来空数组或者
null值,可以添加参数适配:
interests = serializers.ListField( child=serializers.CharField(max_length=100), allow_empty=True, # 允许空数组 allow_null=True # 允许传null )
内容的提问来源于stack exchange,提问作者Gjert
相关产品推荐
相关产品推荐

