Django (DRF) Каналы, получающие SynchronousOnlyOperation при удалении экземпляра пользователя
Я использую DjangoRestChannels (основанный на Django Channels). Я сделал простую страницу комментариев. При добавлении нового Comment
любым экземпляром User
потребитель отправляет его в JS и выводит на HTML.
Все работает, кроме случаев, когда экземпляр User
удаляется, я получаю исключение django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Потребители:
class CommentConsumer(ListModelMixin, GenericAsyncAPIConsumer):
queryset = (
Comment.objects.filter(level=0)
.select_related("user", "parent")
.prefetch_related("children")
.order_by("-date_created")
)
serializer_class = CommentSerializer
permission_classes = (AllowAny, )
@action()
async def subscribe_to_comment_activity(self, request_id, **kwargs):
await self.comment_activity.subscribe(request_id=request_id)
@model_observer(Comment)
async def comment_activity(
self,
message: NewCommentSerializer,
observer=None,
subscribing_request_ids=[],
**kwargs
):
await self.send_json(dict(message.data))
@comment_activity.serializer
def comment_activity(self, instance: Comment, action, **kwargs) -> NewCommentSerializer:
"""Returns the comment serializer"""
return NewCommentSerializer(instance)
Модель:
class Comment(MPTTModel):
""" The base model represents comment object in db. """
user = models.ForeignKey(CustomUser, related_name="comments", on_delete=models.CASCADE)
parent = TreeForeignKey(
"self",
blank=True,
null=True,
related_name="children",
on_delete=models.SET_NULL
)
date_created = models.DateTimeField(
verbose_name="Created at",
auto_now_add=True,
blank=True,
null=True
)
text = models.TextField(max_length=500)
Сериализаторы:
class CommentRecusrsiveChildField(serializers.Serializer):
""" Comment field for nested objects serialization. """
def to_representation(self, instance):
serializer = self.parent.parent.__class__(
instance,
context=self.context
)
serializer_data = serializer.data
return serializer_data
class CommentSerializer(serializers.ModelSerializer):
""" Serializes Comment model data. """
user = BaseCustomUserSerializer()
children = CommentRecusrsiveChildField(many=True, read_only=True)
rate = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Comment
exclude = ('level', 'lft', 'rght', 'tree_id')
read_only_fields = ('date_created', 'children')
В терминале трассировка исключений мне не очень помогла, так как среди всех строк исключений мой код был только : await self.send_json(dict(message.data))
в Consumer
методе async def comment_activity
.
Есть какие-нибудь предположения на эту тему? Буду признателен за любую помощь.