如何在查询集中包含连接表中的字段?

时间:2017-07-31 17:56:09

标签: django orm django-rest-framework

我们有Django Rest Framework在工作,但我是一名前端开发人员,他决定为他的下一个开源项目做一些DRF。

我不希望复制粘贴大量代码,因为您可以看到我的所有序列化程序,模型等... on GitHub

我问开发人员的工作。有人说我应该覆盖to_representation这似乎不对,因为我们正在从头开始构建序列化模型。其他Django开发人员在工作时建议我查看custom relation fields

基本上给出了以下序列化器,我将如何包含"类型"我的查询集中的连接表中的(命名很差的)列:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'countries')

在伪代码中,我正在寻找类似下面的内容,所以当你得到一个用户时,你也会得到关联的countries,它通过多对多关系工作得很好,以及"类型"来自加入表:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'countries', 'pinned.type')

我期待以下内容的JSON响应:

{
    "username": "wildhoney",
    "countries": [
        { "country_id": 4, "type": 1 },
        { "country_id": 5, "type": 2 },
        { "country_id": 6, "type": 3 }
    ]
}

目前我只收到country_id s的列表。

1 个答案:

答案 0 :(得分:1)

你想要使用这样的嵌套关系:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

class AlbumSerializer(serializers.ModelSerializer):
    tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

来源:http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

因此,对于您的情况,它将是:

class PinnedSerializer(ModelSerializer):
    class Meta:
        model = Pinned
        fields = ('type', 'country_id')

class UserSerializer(ModelSerializer):
    pins = PinnedSerializer(many=True, read_only=True)
    class Meta:
        model = User
        fields = ('id', 'username', 'countries', 'pins')

使用实际项目测试的最新版本:

class PinnedSerializer(serializers.ModelSerializer):
    country_id = serializers.ReadOnlyField(source='country.id')
    class Meta:
        model = Pinned
        fields = ('type', 'country_id')


class UserSerializer(serializers.ModelSerializer):
    pinned_set = PinnedSerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'pinned_set')

输出:

{
    "id": 3,
    "username": "bobdole",
    "pinned_set": [
        {
            "type": 1,
            "country_id": 250
        }
    ]
}