Django Channels Rest Framework V3 @model_observer сообщение None
Я пытался найти в документации model observer что-либо, что могло бы объяснить, при каких условиях вызывается model observer с message = None, но ничего особо подсказывающего в нужном направлении не нашёл. Из того, что я понял из примера:
class MyConsumer(GenericAsyncAPIConsumer):
queryset = User.objects.all()
serializer_class = UserSerializer
@model_observer(Comments)
async def comment_activity(
self,
message: CommentSerializer,
observer=None,
subscribing_request_ids=[]
**kwargs
):
await self.send_json(message.data)
@comment_activity.serializer
def comment_activity(self, instance: Comment, action, **kwargs) -> CommentSerializer:
'''This will return the comment serializer'''
return CommentSerializer(instance)
@action()
async def subscribe_to_comment_activity(self, request_id, **kwargs):
await self.comment_activity.subscribe(request_id=request_id)
Сообщение должно быть выходом сериализатора комментариев, поэтому единственная возможность для сообщения стать нулевым - это если сериализатор не вернет ничего!
Чтобы проверить, так ли это, я добавил отпечатки логов, которые, к сожалению, показывают, что сериализатор получает данные, и нет никаких причин, по которым сообщение могло бы быть None. Это также происходит только время от времени, поэтому любой совет о непонимании того, как работает наблюдатель внутри, будет высоко оценен.
В нашей реализации:
class StorageConsumer(ListModelMixin, AsyncAPIConsumer):
"""
Async API endpoint that allows Storage updates to be pushed.
"""
async def accept(self, **kwargs):
await super().accept()
await self.model_change_bess.subscribe()
@model_observer(Bess)
async def model_change_bess(self, message, **kwargs):
if message is None:
logger.warning(f"model_change_bess change without a message")
return
message["model"] = kwargs["observer"].model_cls.__name__
await self.send_json(message)
@model_change_bess.serializer
def model_serialize(self, instance, action, **kwargs):
data = BessSerializer(instance).data
# TODO remove once the message is None bug is fixed
logger.info(f"model_serialize bess instance: {instance} data: {data}")
serialized_data = {
"project_id": data["project"],
"simulation_id": data["simulation"],
"data": data,
}
return serialized_data
соответствующие логи в случае, если сообщение None, выглядят следующим образом:
16/06/2022 13:09:25 [INFO] api_consumers: model_serialize bess instance: Bess object (37227) data: {'id': 37227, 'created': '2022-06-16T13:09:25Z', 'modified': '2022-06-16T13:09:25Z', 'time_stamp': '2022-06-16T13:09:25Z', 'cycles': '0.02541166724274896000000000000000', 'p_bess': '-74.0000', 'soc': '0.45109075850806520000000000000000', 'soh': '0.99514591796314000000000000000000', 'temperature_bess': None, 'time_to_eol': None, 'feedback': True, 'project': 1, 'simulation': 1}
16/06/2022 13:09:25 [WARNING] api_consumers: model_change_bess change without a message