Django-grpc-framework: правильный способ сериализации/десериализации JSON-полей?
как правильно обрабатывать Django JSONFields в django-grpc-framework? Как я могу проверить, какие данные на самом деле отправлены (Evans выкидывает ту же ошибку) =
Когда я пытаюсь получить сериализованный JSONFiled с django-grpc-framework,
в моем data_grpc_client.py возникает следующая ошибка:
python data_grpc_client.py Traceback (последнее последнее обращение): Файл "/my_data/data_grpc_client.py", строка 8, in for datum in stub.List(my_data.lara_data_pb2.DataListRequest()): Файл ".../python3.9/site-packages/grpc/_channel.py", строка 426, in next. return self._next() Файл .../lib/python3.9/site-packages/grpc/_channel.py", строка 826, in _next raise self grpc._channel._MultiThreadedRendezvous: <_MultiThreadedRendezvous RPC, который завершился с: status = StatusCode.UNKNOWN details = "Исключение при итерации ответов: Failed разобрать поле data_JSON: ожидалась строка или байтоподобный объект." debug_error_string = "{"created":"@1648155177.535827174","description":"Error received from пира ipv6:[::1]:50051", "file": "src/core/lib/surface/call.cc", "file_line":905, "grpc_message": "Exception итерация ответов: Не удалось разобрать поле data_JSON: ожидается строка или байтоподобный объект.", "grpc_status":2}"
Буду очень рада любой помощи - заранее большое спасибо! Elain
Вот мои модули python/proto - для воспроизведения ошибки:
У меня есть модель django (4.0.3) с полем JSON:
# models.py
class Data(models.Model):
data_id = models.AutoField(primary_key=True)
data_JSON = models.JSONField(blank=True, null=True, help_text="JSON representation of the data")
Мой serializer.py выглядит следующим образом:
from my_data.models import Data
from django_grpc_framework import proto_serializers
from rest_framework import serializers
import my_data.my_data_pb2
class DataProtoSerializer(proto_serializers.ModelProtoSerializer):
class Meta:
model = Data
proto_class = my_data.my_data_pb2.Data
fields = ['data_id', 'data_JSON']
Автогенерируемый файл protofile (я использовал генератор proto фреймворка django) my_data.proto:
syntax = "proto3";
package my_data;
import "google/protobuf/empty.proto";
service DataController {
rpc List(DataListRequest) returns (stream Data) {}
rpc Create(Data) returns (Data) {}
rpc Retrieve(DataRetrieveRequest) returns (Data) {}
rpc Update(Data) returns (Data) {}
rpc Destroy(Data) returns (google.protobuf.Empty) {}
}
message Data {
int32 data_id = 1;
string data_JSON = 2;
}
message DataListRequest {
}
message DataRetrieveRequest {
int32 data_id = 1;
}
Описание моей службы - services.py :
from my_data.models import Data
from django_grpc_framework import generics
from my_data.serializers import DataProtoSerializer
class DataService(generics.ModelService):
"""
gRPC service that allows users to be retrieved or updated.
"""
queryset = Data.objects.all().order_by('data_id')
serializer_class = DataProtoSerializer
И наконец клиент: data_grpc_client.py:
import grpc
import my_data.my_data_pb2
import my_data.my_data_pb2_grpc
with grpc.insecure_channel('localhost:50051') as channel:
stub = my_data.my_data_pb2_grpc.DataControllerStub(channel)
for datum in stub.List(my_data.my_data_pb2.DataRequest()):
print("datum:",datum.name, end='')