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

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

问题描述:

我们在工作时使用了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') 

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

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

目前我只收到一个列表country_id s。

你会想用这样的嵌套关系:

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 
     } 
    ] 
} 
+0

我这样做,并获得:字段名称'type'是无效的模型'Country'。是因为'type'在'PinnedSerializer'上,而不是'CountrySerializer'上? – Wildhoney

+0

啊,对不起。我误解了。我认为'type'是'Country'上的一个字段。看起来你可能会稍微做一些倒退,你想在你的回复中使用'pins'列表而不是'countries'。 –

+0

也许,但我不知道如何实现这一点。 [源代码在Github上](https://github.com/Wildhoney/TravelMap/tree/master/backend/api)。对于'/ user/wildhoney' [我收到这个](https://pastebin.com/HfAEXvtj)和[我理想需要这个](https://pastebin.com/zAQKh09G)。 – Wildhoney