Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在queryset中包含联接表中的字段?_Django_Orm_Django Rest Framework - Fatal编程技术网

Django 如何在queryset中包含联接表中的字段?

Django 如何在queryset中包含联接表中的字段?,django,orm,django-rest-framework,Django,Orm,Django Rest Framework,我们有Django Rest框架在工作,但是我是一个前端开发人员,决定为他的下一个开源项目做一点DRF 我不希望复制粘贴大量代码,因为您可以看到我所有的序列化程序、模型等 我已经询问了工作中的开发人员。有人说我应该重写到_表示,这似乎不正确,因为我们正在从头开始构建序列化模型。而另一位Django开发人员建议我研究一下 基本上,给定以下序列化程序,我如何在queryset中包含联接表中的“type”(名称不正确)列: class UserSerializer(serializers.ModelS

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

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

我已经询问了工作中的开发人员。有人说我应该重写
到_表示
,这似乎不正确,因为我们正在从头开始构建序列化模型。而另一位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
键下的数据,您可以在我更新的答案中使用该代码。我已经在你的代码中测试过了,它按预期工作(我相信)。太棒了,很高兴我能帮上忙。这对我来说也是一次学习经历:)