在Django序列化程序中,如何序列化外键关系的两端?

时间:2018-11-07 02:18:05

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

在我的Django代码中,我有以下模型:

class Swipe(models.Model):
    user = models.ForeignKey(
        Profile,
        related_name='swipes',
        on_delete=models.CASCADE,
        null=False,
        default=None
    )

    SWIPE_CHOICES = (
        (1, "left"),
        (2, "right"),
        (3, "up"),
        (4, "down")
    )

    direction = models.IntegerField(
        choices = SWIPE_CHOICES
    )

其中Profile是我的用户类。我有一个视图可以显示所有配置文件:

class ProfileList(generics.ListCreateAPIView):
    serializer_class = ProfileSerializer
    queryset = Profile.objects.all()

    def perform_create(self, serializer):
        serializer.save()

ProfileSerializer如下所示:

class ProfileSerializer(serializers.HyperlinkedModelSerializer):

    # serializations of other fields

    class Meta:
        model = Profile
        fields = (
            'url', 'id', 'username', 'password',
            'first_name', 'last_name', 'email',
            'swipes',
        )

我的Profile类的序列化仅返回“滑动”的网址(例如“ [host] / swipe / 1”)。

我知道外键关系应该如何工作的这种相反方式,但是我有办法序列化此滑动信息以显示例如滑动的方向,而不仅仅是URL滑动本身?

序列化Swipe时,我可以通过添加“ user = ProfileSerializer()”来使相关配置文件的序列化工作。但是,当我尝试在代码中添加“ swipes = SwipeSerializer()”时,swipes字段将从显示URL列表变为空地图(“ {}”)。

我正在“逆转”外键关系是一个问题吗?我如何才能使此序列化工作?

1 个答案:

答案 0 :(得分:0)

您需要覆盖swipesProfileSerializer字段的默认序列化。但是,您需要注意,指定的序列化程序没有用于user的字段,该字段最终将以递归方式彼此串行化。

基本上,您需要类似的东西:

class PureSwipeSerializer(serializers.HyperlinkedModelSerializer):
    ...


class PureProfileSerializer(serializers.HyperlinkedModelSerializer):
    ...

class ProfileSerializer(serializers.HyperlinkedModelSerializer):
    swipes = PureSwipeSerializer(many=True)
    ...

class SwipeSerializer(serializers.HyperlinkedModelSerializer):
    profile = PureProfileSerializer(many=False)
    ...