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='')
Вернуться на верх