使用Django rest_框架双向序列化关系

使用Django rest_框架双向序列化关系,django,django-models,django-rest-framework,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.CharFiel

我想知道如何用“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中很好地显示了多对多关系,但MyPoly也没有。我如何使rest_框架意识到关系是双向的,并且需要双向序列化

顺便说一句,这个问题也适用于一对多关系

到目前为止,通过阅读文档和谷歌搜索,我不知道如何做到这一点。

就这样做吧:

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')
class MyPolysSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = testmodels.MyPolys
        fields = ('name', 'text', 'id', 'url', 'mypages2_set')
就这样做吧:

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')
class MyPolysSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = testmodels.MyPolys
        fields = ('name', 'text', 'id', 'url', 'mypages2_set')

我知道了!似乎通过将
mypolys=models.ManyToManyField(mypolys)
添加到
MyPages2
类中,Django确实自动将一个名为
MyPages2\u set
的类似字段添加到
mypolys
类中,因此序列化程序如下所示:

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')
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\u set

我找到了!似乎通过将
mypolys=models.ManyToManyField(mypolys)
添加到
MyPages2
类中,Django确实自动将一个名为
MyPages2\u set
的类似字段添加到
mypolys
类中,因此序列化程序如下所示:

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')
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\u set

谢谢。然而,这是自动发生的——MyPages2显示一个字段“mypolys”,将其链接到这些对象。我缺少的是MyPoly显示它们与MyPages2的关系。我尝试了
类MyPolySerializer(serializers.HyperlinkedModelSerializer):\n mypages2=mypages2序列化器(many=True,read\u=True)\n类元:\n model=testmodels.MyPolys\n字段=('name'、'text'、'id'、'mypages2')
-没有错误,也没有显示'mypages2'。MyPolys项目不知道mypages2,因此,在序列化程序中,如果为空,则有字段mypolis:[],如果为空,则有字段mypolis:[[['id':1,…],['id':2….]]。ViewSet rendering MyPolys不会显示任何与mypages2相关的内容,因为mypages2使用MyPolys,反之亦然。ManyToMany意味着该对象可以在其他地方使用,但不能在对象本身中使用。当您使用m=MyPages2.objects.get(id=…)然后使用m.mypolys.add(mypolis)或m.mypolis.add(p=mypolis.obects.get(id=1))时,会增加json ArrayPages2不是模型mypolys的一部分,所以它不能在MyPolys的序列化程序中序列化。谢谢。我如何让MyPolys类意识到与MyPages2的相互关系?根据我读到的关于Django“Django Unreleased”的书,一个多对多的关系,顺便说一句,两个类只在其中一个上声明(任何一个都不重要),因为Django负责让另一个类知道这个关系。如果不是这样,那么如何让它意识到这一点?顺便说一句,同样的问题在管理面板,不只是休息界面。谢谢。然而,这是自动发生的——MyPages2显示一个字段“mypolys”,将其链接到这些对象。我缺少的是MyPoly显示它们与MyPages2的关系。我尝试了
类MyPolySerializer(serializers.HyperlinkedModelSerializer):\n mypages2=mypages2序列化器(many=True,read\u=True)\n类元:\n model=testmodels.MyPolys\n字段=('name'、'text'、'id'、'mypages2')
-没有错误,也没有显示'mypages2'。MyPolys项目不知道mypages2,因此,在序列化程序中,如果为空,则有字段mypolis:[],如果为空,则有字段mypolis:[[['id':1,…],['id':2….]]。ViewSet rendering MyPolys不会显示任何与mypages2相关的内容,因为mypages2使用MyPolys,反之亦然。ManyToMany意味着该对象可以在其他地方使用,但不能在对象本身中使用。当您使用m=MyPages2.objects.get(id=…)然后使用m.mypolys.add(mypolis)或m.mypolis.add(p=mypolis.obects.get(id=1))时,会增加json ArrayPages2不是模型mypolys的一部分,所以它不能在MyPolys的序列化程序中序列化。谢谢。我如何让MyPolys类意识到与MyPages2的相互关系?根据我读到的关于Django“Django Unreleased”的书,一个多对多的关系,顺便说一句,两个类只在其中一个上声明(任何一个都不重要),因为Django负责让另一个类知道这个关系。如果不是这样,那么如何让它意识到这一点?顺便说一句,管理面板中也存在同样的问题,而不仅仅是REST接口。