我想知道如何使用“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。
到目前为止,从阅读文档和谷歌搜索,我无法弄清楚这是怎么做的。
答案 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
。