【发布时间】:2023-03-03 04:07:01
【问题描述】:
我想要做的是将一个 DRF 模型序列化器嵌套到另一个模型序列化器的字段中
class username_serial(ModelSerializer):
class Meta:
model = User
fields = ['username','email']
class game_serial(ModelSerializer):
user_01 = username_serial()
class Meta:
model = game
fields = ['id','user_01','user_02','is_private','is_accepted']
错误:
应用程序内部的异常:您不能从异步中调用它 上下文 - 使用线程或 sync_to_async。 Traceback(最近的通话 最后):文件 "C:\Users\baza\Desktop\production\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", 第 173 行,在 get rel_obj = self.field.get_cached_value(instance) 文件“C:\Users\baza\Desktop\production\venv\lib\site-packages\django\db\models\fields\mixins.py”, 第 15 行,在 get_cached_value 中 return instance._state.fields_cache[cache_name] KeyError: 'user_01'
这在没有 Django Chennels 的情况下正常工作,因为通道是异步的,我不能使用同步代码,通过使用可以正常工作:
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
在设置文件中,但在生产方面这不是一种安全的方法。 我尝试使用通道的 database_sync_to_async 作为装饰器以及具有 SerializerMethodField 的函数,如下所示:
class game_serial(ModelSerializer):
user_01 = SerializerMethodField(read_only=True)
@database_sync_to_async
def get_user_01(self, obj):
username = obj.user_01.username
return str(username)
class Meta:
model = game
fields = ['id','user_01','user_02','is_private','is_accepted']
但我回来了:
[OrderedDict([('id', 23), ('user_01', <coroutine object SyncToAsync.__call__ at 0x0000000005DF6678>), ('user_02', None), ('is_private', False), ('is_accepted', False)]), OrderedDict([('id', 24), ('user_01', <coroutine object SyncToAsync.__call__ at 0
x0000000005DF6D58>), ('user_02', None), ('is_private', False), ('is_accepted', False)])]
有一个
应用程序内部异常:“协程”类型的对象不是 JSON 可序列化
所以我猜 JSON 无法序列化那些“协程”对象,通常我应该或“想要”获取它们的实际值。
我该怎么做?欢迎任何解决方法或其他方法,在此先感谢您。
在消费者.py ..
games = await database_sync_to_async(self.get_games)()
serialized_games = game_serial(games, many=True)
await self.send({
"type": "websocket.send",
'text': json.dumps(serialized_games.data)
})
def get_games(self):
return list(game.objects.all())
【问题讨论】:
标签: django asynchronous django-rest-framework django-channels