Django автоматически конвертирует двойные кавычки в одинарные кавычки в текстовом поле - PullRequest
2 голосов
/ 03 ноября 2019

У меня есть очень простой django view и сериализатор и база данных Postgres в сочетании с популярным пакетом dj-stripe. Dj-stripe сохраняет некоторые данные json в текстовом поле (столбец = billing_details) в базе данных, и это выглядит так, с двойными кавычками:

{"address":{"city":null,"country":null,"line1":null,"line2":null,"postal_code":"11111","state":null},"email":null,"name":"Jenny Rosen","phone":null}

К сожалению, кажется, что-то (django? python?) преобразует его в одинарные кавычки (и добавляет несколько пробелов после двоеточий) следующим образом:

{'address': {'city': None, 'country': None, 'line1': None, 'line2': None, 'postal_code': '11111', 'state': None}

Мой взгляд очень прост:

class GetCustomerView(generics.ListAPIView):

  authentication_classes = (TokenAuthentication,)
  PaymentMethodSerializer

  def list(self, request):
    customer = Customer.objects.get(subscriber=request.user.organization_id)
    cards = PaymentMethod.objects.filter(customer=customer.djstripe_id)
    serializer = PaymentMethodSerializer(cards, many=True)
    pprint(serializer.data) 
    if cards:
        return Response(serializer.data)
    else: 
        return Response('error', status=status.HTTP_400_BAD_REQUEST)`

, а мой сериализатор просттоже:

class PaymentMethodSerializer(serializers.ModelSerializer):
  card = json.loads(serializers.JSONField())
  billing_details = json.loads(serializers.JSONField())

  class Meta:
    model = PaymentMethod
    fields = ( 'id', 'billing_details', 'card',)

Очевидно, что лучше всего его хранить в поле JSONB, но изменение пакета не вариант. Тем не менее, как я могу предотвратить это преобразование?

1 Ответ

0 голосов
/ 03 ноября 2019

Решением для меня было установить для сериализатора значение DictField

class PaymentMethodSerializer(serializers.ModelSerializer):
  card = serializers.DictField()
  billing_details = serializers.DictField()

  class Meta:
    model = PaymentMethod
    fields = ( 'id', 'billing_details', 'card',)

Это привело к тому, что одинарные кавычки стали двойными. Хотя это диктат, а не JSON (требуется немного больше массажа, чтобы достичь истинного json), он гораздо более дружелюбен, чем использование одинарных кавычек, которые трудно заменить. Я не совсем понимаю, почему JSONfield не сериализует вывод в json по умолчанию, но, возможно, у меня нет понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...