178

次のモデルがあるとします。

class Classroom(models.Model):
    room_number = [...]

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

ManyRelatedPrimaryKeyField 関数ごとに次のような結果を取得する代わりに、次のようにします。

{
    "room_number": "42", 
    "teachers": [
        27, 
        24, 
        7
    ]
},

次のような完全な関連モデル表現を含むものを返すようにします。

{
    "room_number": "42", 
    "teachers": [
        {
           'id': 27,
           'name': 'John',
           'tenure': True
        }, 
        {
           'id': 24,
           'name': 'Sally',
           'tenure': False
        }, 
    ]
},

これは可能ですか?もしそうなら、どのように?そして、これは悪い考えですか?

4

4 に答える 4

275

最も簡単な方法は、深さ引数を使用することです

class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        depth = 1

ただし、これには前方の関係の関係のみが含まれます。この場合、teachers フィールドは逆の関係であるため、これは必要なものではありません。

より複雑な要件がある場合 (例: 逆の関係を含める、一部のフィールドのみをネストする、他のフィールドをネストしない、フィールドの特定のサブセットのみをネストする)、シリアライザーをネストできます。

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 引数を使用して、フィールドのソースとして使用する属性を指定していることに注意してください。代わりに、モデルでrelated_nameオプションを使用して属性が存在するsourceことを確認することで、引数を削除できます。teachersTeacherclassroom = models.ForeignKey(Classroom, related_name='teachers')

注意すべきことの 1 つは、入れ子になったシリアライザーは現在、書き込み操作をサポートしていないということです。書き込み可能な表現には、pk やハイパーリンクなどの通常のフラットな表現を使用する必要があります。

于 2013-01-29T11:27:15.303 に答える
48

ありがとう@TomChristie!!! あなたは私をたくさん助けてくれました!少し更新したいと思います(私が遭遇した間違いのため)

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",)
于 2016-09-21T17:24:51.277 に答える