Как работать с сериализатором, которому нужен контекст

У меня тут ситуация, когда сериализатору нужен контекст, в основном объект запроса.

class ProductSerializer(ModelSerializer):
    distance_away = SerializerMethodField(read_only=True)

    class Meta:
        model = Product

        fields = [
            'pk',
            'distance_away',
        ]

    def get_distance_away(self, obj):
        coordinates = self.context["coordinates"]
        distance_in_km = None

        if coordinates != 'null' and coordinates is not None:
            lat = float(tuple(coordinates.split(","))[0])
            lng = float(tuple(coordinates.split(","))[1])
            ....

Это означает, что я должен передавать контекст каждый раз, когда я использую или вызываю сериализатор. Это нормально для обычных представлений drf.

Теперь я столкнулся с ситуацией, когда мне нужно использовать сериализатор в ModelObserver

class MarketplaceConsumer(GenericAsyncAPIConsumer):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [HasApiKey]

    @model_observer(Product)
    async def marketplace_activity(self, message: ProductSerializer, observer=None, **kwargs):
        await self.send_json(message)

    @marketplace_activity.serializer
    def marketplace_activity(self, instance: Product, action, **kwargs) -> ProductSerializer:
        '''This will return the product serializer'''
       
        return ProductSerializer(instance, context={'request': self.request}).data

В этот момент я получу следующую ошибку, которая имеет смысл (self.request):

У объекта 'ModelObserver' нет атрибута 'request' Этот ModelObserver предназначен для обработки действий с каналом websocket.

Есть ли способ решить эту ситуацию?

Вернуться на верх