使用Django rest_framework两种方式序列化关系

时间:2016-06-14 04:04:48

标签: django django-models django-rest-framework

我想知道如何使用“djangorestframework”以两种方式序列化对象之间的相互关系。目前,这种关系只显示了一种方式:

class MyPolys(models.Model):
    name = models.CharField(max_length=20)
    text = models.TextField()
    poly = models.PolygonField()

class MyPages2(models.Model):
    name = models.CharField(max_length=20)
    body = models.TextField()
    mypolys = models.ManyToManyField(MyPolys)

# ...

class MyPolysSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = testmodels.MyPolys

class MyPages2Serializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = testmodels.MyPages2

# ...

class MyPolyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = testmodels.MyPolys.objects.all()
    serializer_class = srlz.MyPolysSerializer

class MyPages2ViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = testmodels.MyPages2.objects.all()
    serializer_class = srlz.MyPages2Serializer

多对多关系在MyPages2的api中显示得很好,但对于MyPolys也没有。我如何使rest_framework意识到这种关系是双向的,需要两种方式进行序列化?

这个问题也适用于一对多关系btw。

到目前为止,从阅读文档和谷歌搜索,我无法弄清楚这是怎么做的。

2 个答案:

答案 0 :(得分:0)

就这样做:

class MyPolysSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = testmodels.MyPolys
        fields =('id','name','text','poly')


class MyPages2Serializer(serializers.HyperlinkedModelSerializer):

    mypolys = MyPolysSerializer(many=True,read_only=True)

    class Meta:
        model = testmodels.MyPages2
        fields =('id','name','body','mypolys')

答案 1 :(得分:0)

我明白了!看来,通过向mypolys = models.ManyToManyField(MyPolys)类添加MyPages2,Django确实自动向mypages2_set类添加了一个名为MyPolys的类似字段,因此序列化程序如下所示:

class MyPolysSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = testmodels.MyPolys
        fields = ('name', 'text', 'id', 'url', 'mypages2_set')

我通过使用./manage.py shell检查shell中的类的实例来发现:

pol = testmodels.MyPolys.objects.get(pk=1)
pol. # hit the tab key after '.'

在''之后按Tab键。显示其他字段和方法,包括mypages2_set