Обновить данные сериализатора в Django - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь добавить словарь к своим сериализованным данным, но получаю сообщение об ошибке dictionary update sequence element #0 has length 6; 2 is required

Вот что я пробовал:

def get_data(self, request):

    created_by = User_Detail.objects.get(auth_token__isnull=False)
    newdict = {'created_by': created_by.id}
    details = ExSerializer(Tower.objects.all(), many=True).data
    newdict.update(details)
    return Response({"expenses": newdict})

Я попробовал выше код но у меня он не работает.

1 Ответ

0 голосов
/ 27 мая 2020

Причина root этой проблемы в том, что вы пытаетесь обновить словарь списком.

Минимальный код для имитации этой проблемы:

d = {1: "one", 2: "three"}
d.update([(1,)])

выдаст ошибку of

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
    d.update([(1,)])
ValueError: dictionary update sequence element #0 has length 1; 2 is required

Для вашего случая вы обновляете newdict списком из ExSerializer (Tower.objects.all() с many=True).

Чтобы решить эту проблему, вы должны необходимо настроить код, чтобы извлечь только одну запись из Tower, или составить список результатов, объединяющих каждого пользователя в одну Tower запись, в зависимости от вашего конкретного варианта использования.

- ИЗМЕНИТЬ -

Если вы хотите, чтобы все записи Tower в одном запросе, вам нужно будет применить несколько сериализаторов.

Код будет похож на этот (не тестировался):

def get_data(self, request):
    created_by = User_Detail.objects.get(auth_token__isnull=False)
    return Response({"expenses": UserDetailSerializer({"created_by": created_by}).data})


class UserDetailSerializer(serializers.ModelSerializer):
    created_by = serializers.IntegerField()
    details = serializers.SerializerMethodField()

    class Meta:
        model = User_Detail
        fields = ('created_by', 'details')

    def get_details(self, obj):
        return ExSerializer(Tower.objects.all(), many=True).data
...