Как работать с сериализатором, которому нужен контекст
У меня тут ситуация, когда сериализатору нужен контекст, в основном объект запроса.
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.
Есть ли способ решить эту ситуацию?