1. ホーム
  2. python

[解決済み] Django Rest Frameworkを使用して、関連するモデルフィールドを含めるにはどうすればよいですか?

2022-04-21 07:03:24

質問

例えば、次のようなモデルがあるとします。

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
        }, 
    ]
},

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

解決方法は?

最も簡単な方法は 深さの引数

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

しかし、この場合、順方向のリレーションシップしか含まれません。この場合、教師フィールドは逆方向のリレーションシップなので、必要なものではありません。

もっと複雑な要件 (たとえば、逆方向のリレーションシップを含める、一部のフィールドはネストするが他のフィールドはネストしない、あるいは特定のフィールドのサブセットのみをネストする) がある場合は、次のようにします。 ネストシリアライザー 例えば...

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 引数の代わりに teachers 属性が存在する場合は 関連名 オプションで Teacher モデル、つまり classroom = models.ForeignKey(Classroom, related_name='teachers')

注意点としては、ネストされたシリアライザーは現在書き込み操作をサポートしていないことです。 書き込み可能な表現には、pkやハイパーリンクのような通常のフラットな表現を使うべきでしょう。