XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的
Posted
技术标签:
【中文标题】XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的【英文标题】:Django serializer ManyRelatedManager object at XX is not JSON serializable 【发布时间】:2016-04-01 04:52:42 【问题描述】:我正在尝试将 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 对象在 0x7f648017bfd0> 不是 JSON 可序列化的
当我打印序列化程序数据时,dict 类型将广告字段作为 ManyRelatedManager 表示形式。
我该如何解决这个错误?有什么方法可以告诉序列化程序如何呈现该特定字段?
感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:TL;DR:答案是class.property.all()
。
这里的问题在于 ManyRelatedManager
不是相关对象的实际列表,而是一个 Django 类,您必须从中调用 all()
(或 filter()
或 get()
)才能获取您的数据。尝试序列化相关管理器是没有意义的。
看这个例子:
class SomeClass(models.Model):
friends = models.ManyToManyField(User)
如果我有一个名为 some_class
的 SomeClass
实例,则调用 some_class.friends
将返回:
<RelatedManager>
some_class.friends.all()
将返回
[<User>, <User>, ecc]
旁注:
你应该不在ManyToManyField
上使用null=False
:它没用。如您所知,当您创建一个新的 BaseSearchService
时,您的 advertisements
字段为空(因此,证明 null=False 没有任何意义)。这是因为,在数据库级别,M2M 字段不是BaseSearchService
表中的列,而是表本身。
每次调用.add()
(或任何其他管理器方法,如.remove()
)时,都会调用数据库,独立于具有M2M 字段的模型实例的.save()
方法。换句话说,也不需要调用sickPerson.save()
。
【讨论】:
感谢您的回答。那么我应该将朋友列表传递给序列化程序,而不是传递给 Someclass 实例,而是作为另一个序列化程序字段吗? 感谢您的帮助。我已经完成了所需的解决方案! 没问题,很高兴它有帮助! :) 如果您还没有这样做,如果您想继续使用 Django 进行开发,我建议您仔细阅读此页面:docs.djangoproject.com/en/1.9/ref/models/relations 它并没有真正帮助。我们都知道它不是序列化的。不提供解决方案,只是告诉它不可能不是真正的解决方案.. 该解决方案在我的回答中按字面意思显示了 2 次。与您撰写评论相比,您通读它所花费的时间会更少。以上是关于XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章
/graphql 处的 Django ImportError
在 BigQuery 中读取时,未定义行 XXXX、列 xx-xx 处的 JSON 输入意外结束
django 管理员加载错误:/admin/login/ 处的 ImportError 没有名为后端的模块
Django - 字典更新序列元素#0 的长度为 1; 2是必需的[重复]
Azure 中的 Django 应用程序 - /edit_profile/ 处的 OperationalError(1366,“第 1 行的列 'first_name' 的字符串值不正确:'\\xC5