XX的Django序列化器ManyRelatedManager对象不是JSON可序列化的

时间:2015-12-26 20:16:23

标签: python json django serialization

我正在尝试将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 个答案:

答案 0 :(得分:2)

这里的问题在于all()不是相关对象的实际列表,而是Django类,您必须从中调用filter()(或get()或{ {1}})以获取您的数据。尝试序列化相关经理是没有意义的。

看看这个例子:

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

如果我的SomeClass实例名为some_class,则调用some_class.friends将会返回:

<RelatedManager>

some_class.friends.all()将返回

[<User>, <User>, ecc]

旁注:

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

每次调用.add()(或任何其他管理器方法,如.remove())时,都会调用数据库,而不依赖于模型实例的.save()方法。 M2M领域。换句话说,也不需要调用sickPerson.save()