gpt4 book ai didi

python - XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的

转载 作者:行者123 更新时间:2023-11-28 16:28:27 31 4
gpt4 key购买 nike

我正在尝试对具有多对多字段的模型使用 ModelSerializer。

这是我模型的一部分:

class BaseSearchService(models.Model):

advertisements = models.ManyToManyField(Advertisement, null=False,
blank=False)

这是序列化器

class SearchTransportSickPersonSerializer(serializers.ModelSerializer):

person = TransportPersonComponentSerializer()
owner = serializers.ReadOnlyField(source='owner.username')
advertisements = serializers.ReadOnlyField()

class Meta:
model = SearchTransportSickPerson
fields = ('name', 'description',
'date_service_full_day', 'date_service', 'origin_lat',
'origin_long', 'destinity_lat', 'destinity_long', 'multiple_stops',
'person', 'owner', 'advertisements')

def create(self, validated_data):

user_data = validated_data.pop('owner')
advs = validated_data.pop('advertisements')

user = User.objects.get(email=user_data.email)

person_data = self.validated_data.pop('person')
person = TransportPersonComponent.objects.create(**person_data)

sickPerson = SearchTransportSickPerson.objects.create(person=person,
owner=user, **self.validated_data)

for adv in advs:
a = Advertisement.objects.get(id=adv.id)
sickPerson.advertisements.add(a)

sickPerson.save()

return sickPerson

我编写了一个单元测试来重现错误:

def test_serializer_2(self):
transportSickPerson = SearchTransportSickPerson(name="name",
description="desc", date_service=date_serv, date_service_full_day=
True, person=self.component, owner=self.user)

transportSickPerson.save()

transportSickPerson.advertisements.add(advertise)

serializer = SearchTransportSickPersonSerializer(transportSickPerson)
content = JSONRenderer().render(serializer.data)

当我尝试使用 JSON 渲染器渲染序列化程序时,抛出以下错误:

TypeError: .ManyRelatedManager object at 0x7f648017bfd0> 不是 JSON 可序列化的

当我打印序列化程序数据时,dict 类型将广告字段作为 ManyRelatedManager 表示。

我该如何解决这个错误?有什么方法可以告诉序列化程序如何呈现该特定字段?

感谢您提供的任何帮助。

最佳答案

TL;DR:答案是 class.property.all()


这里的问题在于 ManyRelatedManager 不是相关对象的实际列表,而是一个 Django 类,您必须从中调用 all() (或 filter()get()) 以获取您的数据。尝试序列化相关管理器毫无意义。

看这个例子:

class SomeClass(models.Model):
friends = models.ManyToManyField(User)

如果我有一个名为 some_classSomeClass 实例,调用 some_class.friends 将返回:

<RelatedManager>

some_class.friends.all() 将返回

[<User>, <User>, ecc]

旁注:

您应该ManyToManyField 上使用null=False:它没有用。如您所知,当您创建一个新的 BaseSearchService 时,您的 advertisements 字段是空的(因此,表明 null=False 没有任何作用)。这是因为,在数据库级别,M2M 字段不是 BaseSearchService 表中的列,而是它本身的表。

每次调用 .add()(或任何其他管理器方法,如 .remove())时,都会独立于 调用数据库>.save() 存在M2M字段的模型实例的方法。换句话说,也不需要调用 sickPerson.save()

关于python - XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474893/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com