Django 如何在queryset中包含联接表中的字段?
我们有Django Rest框架在工作,但是我是一个前端开发人员,决定为他的下一个开源项目做一点DRF 我不希望复制粘贴大量代码,因为您可以看到我所有的序列化程序、模型等 我已经询问了工作中的开发人员。有人说我应该重写Django 如何在queryset中包含联接表中的字段?,django,orm,django-rest-framework,Django,Orm,Django Rest Framework,我们有Django Rest框架在工作,但是我是一个前端开发人员,决定为他的下一个开源项目做一点DRF 我不希望复制粘贴大量代码,因为您可以看到我所有的序列化程序、模型等 我已经询问了工作中的开发人员。有人说我应该重写到_表示,这似乎不正确,因为我们正在从头开始构建序列化模型。而另一位Django开发人员建议我研究一下 基本上,给定以下序列化程序,我如何在queryset中包含联接表中的“type”(名称不正确)列: class UserSerializer(serializers.ModelS
到_表示
,这似乎不正确,因为我们正在从头开始构建序列化模型。而另一位Django开发人员建议我研究一下
基本上,给定以下序列化程序,我如何在queryset中包含联接表中的“type”(名称不正确)列:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', '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 }
]
}
目前,我只收到一个国家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')
资料来源:
因此,就您的情况而言:
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
在PinnedSerializer
上,而不是CountrySerializer
上吗?啊,对不起。我误解了。我以为type
是Country
上的一个字段。看起来你可能做得有点倒退,你希望在你的回复中有一个pins
列表,而不是countries
。也许吧,但我不确定如何实现这一点。对于/user/wildhoney
,和@wildhoney,我知道这不是最优的,但是如果您愿意接受pinted\u set
键下的数据,您可以在我更新的答案中使用该代码。我已经在你的代码中测试过了,它按预期工作(我相信)。太棒了,很高兴我能帮上忙。这对我来说也是一次学习经历:)