gui*_*uer 5 python django serialization json
我正在尝试将 ModelSerializer 用于具有多对多字段的模型。
这是我模型的一部分:
class BaseSearchService(models.Model):
advertisements = models.ManyToManyField(Advertisement, null=False,
blank=False)
Run Code Online (Sandbox Code Playgroud)
这是序列化程序
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
Run Code Online (Sandbox Code Playgroud)
我编写了一个单元测试来复制错误:
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)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 JSON 渲染器渲染序列化器时,会抛出以下错误:
TypeError: .ManyRelatedManager 对象在 0x7f648017bfd0> 不是 JSON 可序列化的
当我打印序列化程序数据时,dict 类型将广告字段作为 ManyRelatedManager 表示。
我该如何解决这个错误?有什么方法可以告诉序列化程序如何呈现该特定字段?
感谢您提供的任何帮助。
TL;DR:答案是class.property.all()。
这里的问题在于 aManyRelatedManager不是相关对象的实际列表,而是一个 Django 类,您必须从中调用all()(或filter()或get())才能获取数据。试图序列化相关的管理器是没有意义的。
看这个例子:
class SomeClass(models.Model):
friends = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)
如果我有一个SomeClass被some_class调用的实例,调用some_class.friends将返回:
<RelatedManager>
Run Code Online (Sandbox Code Playgroud)
whilesome_class.friends.all()会返回
[<User>, <User>, ecc]
Run Code Online (Sandbox Code Playgroud)
边注:
你应该不使用null=False的ManyToManyField:它是无用的。正如您已经知道的,当您创建一个新字段时,您BaseSearchService的advertisements字段是空的(因此,证明 null=False 没有用处)。这是因为,在数据库级别,M2M 字段不是BaseSearchService表中的列,而是表本身。
每次调用.add()(或任何其他管理器方法,如.remove())时,都会调用数据库,独立于.save()具有 M2M 字段的模型实例的方法。换句话说,不需要调用sickPerson.save()也。
| 归档时间: |
|
| 查看次数: |
7117 次 |
| 最近记录: |