首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Django Rest框架包含相关的模型字段?

如何使用Django Rest框架包含相关的模型字段?
EN

Stack Overflow用户
提问于 2013-01-29 07:22:20
回答 3查看 89.2K关注 0票数 174

假设我们有以下模型:

代码语言:javascript
复制
class Classroom(models.Model):
    room_number = [...]

class Teacher(models.Model):
    name = [...]
    tenure = [...]
    classroom = models.ForeignKey(Classroom)

假设每个ManyRelatedPrimaryKeyField函数都会得到这样的结果:

代码语言:javascript
复制
{
    "room_number": "42", 
    "teachers": [
        27, 
        24, 
        7
    ]
},

让它返回包含完整相关模型表示的内容,如下所示:

代码语言:javascript
复制
{
    "room_number": "42", 
    "teachers": [
        {
           'id': 27,
           'name': 'John',
           'tenure': True
        }, 
        {
           'id': 24,
           'name': 'Sally',
           'tenure': False
        }, 
    ]
},

这个是可能的吗?如果是这样的话,是怎么做的?这是个坏主意吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-29 19:27:15

最简单的方法是使用the depth argument

代码语言:javascript
复制
class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        depth = 1

但是,这将只包括正向关系的关系,在这种情况下,这并不是您所需要的,因为教师字段是反向关系。

如果你有更复杂的需求(例如,包括反向关系,嵌套一些字段,但不嵌套其他字段,或仅嵌套特定字段子集)您可以nest serializers,例如...

代码语言:javascript
复制
class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'tenure')

class ClassroomSerializer(serializers.ModelSerializer):
    teachers = TeacherSerializer(source='teacher_set')

    class Meta:
        model = Classroom

请注意,我们在序列化程序字段上使用source参数来指定用作字段源的属性。我们可以删除source参数,而是通过在Teacher模型上使用related_name选项来确保teachers属性存在,即。classroom = models.ForeignKey(Classroom, related_name='teachers')

要记住的一件事是,嵌套序列化程序目前不支持写操作。对于可写表示,您应该使用常规平面表示,例如pk或超链接。

票数 270
EN

Stack Overflow用户

发布于 2016-09-22 01:24:51

谢谢@TomChristie!你帮了我很多!我想稍微更新一下(因为我遇到了一个错误)

代码语言:javascript
复制
class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'tenure')

class ClassroomSerializer(serializers.ModelSerializer):
    teachers = TeacherSerializer(source='teacher_set', many=True)

    class Meta:
        model = Classroom
        field = ("teachers",)
票数 47
EN

Stack Overflow用户

发布于 2019-07-16 20:01:15

这也可以通过使用一个名为drf-flex-fields的非常方便的django包来实现。我们使用它,它非常棒。你只需要安装它,通过你的串行化程序,添加expandable_fieldspip install drf-flex-fields (下面的例子)。它还允许您使用点表示法指定深度嵌套关系。

代码语言:javascript
复制
from rest_flex_fields import FlexFieldsModelSerializer

class ClassroomSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = Model
        fields = ("teacher_set",)
        expandable_fields = {"teacher_set": (TeacherSerializer, {"source": "teacher_set"})}

然后将?expand=teacher_set添加到您的URL中,它将返回一个扩展的响应。希望有一天这能帮助到某个人。干杯!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14573102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档