在Django中更新序列器数据

问题描述 投票:0回答:1

我试图向我的序列化数据添加一个字典,但我得到一个错误的信息 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})

我试过上面的 编码 但对我来说,它不工作。

python django django-models django-rest-framework django-views
1个回答
0
投票

这个问题的根本原因是你试图用列表更新一个字典。

模拟这个问题的最小代码。

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

会给出一个错误

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 记录,取决于你的具体使用情况。

-- EDIT --

如果你想要所有的记录 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
© www.soinside.com 2019 - 2024. All rights reserved.