如何在查询集中包含连接表中的字段?
问题描述:
我们在工作时使用了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
}
]
}
我这样做,并获得:字段名称'type'是无效的模型'Country'。是因为'type'在'PinnedSerializer'上,而不是'CountrySerializer'上? – Wildhoney
啊,对不起。我误解了。我认为'type'是'Country'上的一个字段。看起来你可能会稍微做一些倒退,你想在你的回复中使用'pins'列表而不是'countries'。 –
也许,但我不知道如何实现这一点。 [源代码在Github上](https://github.com/Wildhoney/TravelMap/tree/master/backend/api)。对于'/ user/wildhoney' [我收到这个](https://pastebin.com/HfAEXvtj)和[我理想需要这个](https://pastebin.com/zAQKh09G)。 – Wildhoney