Django模型对象创建/更新时JSON序列化错误的解决求助
问题解决方法
1. 序列化错误的核心原因
DRF的Response不能直接接收Django模型实例,必须通过序列化器把模型对象转换成JSON可识别的格式,直接传实例就会触发Object of type Email is not JSON serializable错误。
2. 实现“存在更新、不存在创建”的正确方式
用Django提供的update_or_create方法,它会自动根据主键(这里是user_email)判断是否存在记录,存在则更新字段,不存在则创建新记录,比手动判断更简洁可靠。
3. 修改后的views.py代码片段
from django.utils import timezone class UserListView(APIView): serializer_class = EmailSerializer queryset = Email.objects.all() pagination_class = StandardResultsSetPagination def get_serializer_class(self): if self.action == 'list': return EmailListSerializer return EmailSerializer def post(self, request, *args, **kwargs): user_email = request.POST.get('user_email') parametros = request.POST email='email=' + user_email response = UserConnector(email).get_user_data() obgs = response[1]['results'] # 初始化字段值,处理空结果的情况 email_stat = None email_scor = None email_valid = None frau = None if len(obgs) > 0: obg = response[1]['results'][0] email_stat = obg.get('email_status') email_scor = obg.get('email_score') email_valid = obg.get('valid_email') frau = obg.get('fraud') # 使用update_or_create实现创建/更新逻辑 email_obj, created = Email.objects.update_or_create( user_email=user_email, # 主键匹配条件 defaults={ 'user_phone_number': request.POST.get('user_phone_number'), 'user_device_id': request.META.get('HTTP_DEVICE', ''), 'lat': request.POST.get('lat'), 'lng': request.POST.get('lng'), 'user_address': request.POST.get('user_address'), 'creation_date': timezone.now(), # 注意要调用函数,不是传函数对象 'email_status': email_stat if email_stat is not None else False, 'email_score': email_scor if email_scor is not None else 0, 'valid_email': email_valid if email_valid is not None else False, 'fraud': frau if frau is not None else False, } ) # 用序列化器处理模型实例,再返回Response serializer = self.get_serializer(email_obj) return Response(serializer.data)
关键修改点说明
- 用
update_or_create替代手动创建实例:第一个参数是匹配条件(主键user_email),defaults字典里是要更新/创建的字段值。 - 修正
creation_date:把timezone.now改成timezone.now(),否则会把函数对象存进去,导致错误。 - 处理空值:当接口返回空结果时,给布尔/整数字段设置合理默认值,避免和模型字段类型不匹配。
- 序列化实例:用
self.get_serializer()(会自动匹配你定义的EmailSerializer)把模型对象转成可序列化的数据,再传给Response。
内容的提问来源于stack exchange,提问作者laur
相关产品推荐
相关产品推荐

