Django开发API时序列化器实例化触发两类报错如何解决?
问题描述
我在使用Django编写API时遇到以下问题:按照如下方式创建序列化器对象时:
document_serializer = DocumentSalesforceSerializer(data={ "AccountId": patient_id, "ContactId": patient_id, "Proveedor__c": "docline", "Servicio_asociado__c": "report", "Mapfre_Id__c": patient_id, "Status": "In Progress", "StartDate": document["createdAt"], "EndDate": "hoy", "Subject": document["category"], "Description": description, "SAV_fld_source__c": "docline", "SAV_fld_doclineExtId__c": id, "SAV_fld_doctor__c": "", }) document_serializer.is_valid(raise_exception=True)
收到如下报错:
The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.
查阅网上资料后,有用户建议删除data=参数,调整后代码如下:
document_serializer = DocumentSalesforceSerializer({ "AccountId": patient_id, "ContactId": patient_id, "Proveedor__c": "docline", "Servicio_asociado__c": "report", "Mapfre_Id__c": patient_id, "Status": "In Progress", "StartDate": document["createdAt"], "EndDate": "hoy", "Subject": document["category"], "Description": description, "SAV_fld_source__c": "docline", "SAV_fld_doclineExtId__c": id, "SAV_fld_doctor__c": "", }) document_serializer.is_valid(raise_exception=True)
但此时又触发新的报错:Cannot call '.is_valid()' as no 'data=' keyword argument was passed when instantiating the serializer instance.
完整错误追溯栈
Traceback (most recent call last): File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\trans_real.py", line 194, in _add_installed_apps_translations app_configs = reversed(list(apps.get_app_configs())) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\apps\registry.py", line 145, in get_app_configs self.check_apps_ready() File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\apps\registry.py", line 136, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\debug_kafka.py", line 30, in <module> main() File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\debug_kafka.py", line 26, in main event_handler(event) File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\app\connector\kafka_events.py", line 170, in event_handler event_logic(event_type, event_id) File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\app\connector\kafka_events.py", line 158, in event_logic return document_ops(event, id) File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\app\connector\kafka_events.py", line 134, in document_ops document_create_ops(id) File "C:\Users\carlos.dcoco\Documents\savia-docl\docline-integration\app\connector\kafka_events.py", line 110, in document_create_ops document_serializer.is_valid(raise_exception=True) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\rest_framework\serializers.py", line 220, in is_valid self._validated_data = self.run_validation(self.initial_data) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\rest_framework\serializers.py", line 419, in run_validation value = self.to_internal_value(data) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\rest_framework\serializers.py", line 476, in to_internal_value validated_value = field.run_validation(primitive_value) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\rest_framework\fields.py", line 797, in run_validation self.fail('blank') File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\rest_framework\fields.py", line 640, in fail message_string = msg.format(**kwargs) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\functional.py", line 135, in __wrapper__ res = func(*self.__args, **self.__kw) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\__init__.py", line 94, in gettext return _trans.gettext(message) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\trans_real.py", line 355, in gettext _default = _default or translation(settings.LANGUAGE_CODE) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\trans_real.py", line 268, in translation _translations[language] = DjangoTranslation(language) File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\trans_real.py", line 155, in __init__ self._add_installed_apps_translations() File "C:\Users\carlos.dcoco\Documents\savia-docl\env\lib\site-packages\django\utils\translation\trans_real.py", line 196, in _add_installed_apps_translations raise AppRegistryNotReady( django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time. Process finished with exit code 1
报错原因分析
- 第一个翻译基础设施初始化报错:该问题出现在独立运行的Django脚本中,脚本启动时没有完成Django应用的注册加载流程,当序列化器字段校验不通过需要返回错误提示时,会调用Django的国际化翻译模块,而翻译模块依赖已加载完成的应用注册表,因此抛出
AppRegistryNotReady异常。 - 第二个
is_valid()调用报错:Django REST Framework的序列化器设计中,只有通过data=关键字参数传入的内容才会被识别为待校验的输入数据,直接传入位置参数默认是绑定已有的ORM实例,此时序列化器没有待校验的数据源,因此无法调用is_valid()方法,网上给出的删除data=参数的建议是错误的。
解决方案
在当前运行的独立脚本最顶部,导入其他Django相关模块之前,先添加以下两行代码手动完成Django初始化即可:
from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
上述代码会触发Django完整的配置加载、应用注册流程,应用加载完成后再调用序列化器逻辑就不会触发翻译初始化报错,同时保留序列化器的data=关键字参数传参即可正常调用is_valid()完成参数校验。
内容的提问来源于stack exchange,提问作者carlos de la morena
相关产品推荐
相关产品推荐

