You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:24:52