1. ホーム
  2. python

[解決済み] django-rest-framework のシリアライザーを使って外部キー値を取得する

2022-07-26 03:29:41

質問

私はdjango restフレームワークを使ってAPIを作成しています。 私は以下のモデルを持っています。

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name


class Item(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, related_name='items')

    def __unicode__(self):
        return self.name

カテゴリのシリアライザーを作るために私なら

class CategorySerializer(serializers.ModelSerializer):
    items = serializers.RelatedField(many=True)

    class Meta:
        model = Category

... そして、これは私に提供することになります。

[{'items': [u'Item 1', u'Item 2', u'Item 3'], u'id': 1, 'name': u'Cat 1'},
 {'items': [u'Item 4', u'Item 5', u'Item 6'], u'id': 2, 'name': u'Cat 2'},
 {'items': [u'Item 7', u'Item 8', u'Item 9'], u'id': 3, 'name': u'Cat 3'}]

アイテムシリアライザーから逆引きを行うにはどうしたらよいでしょうか。

[{u'id': 1, 'name': 'Item 1', 'category_name': u'Cat 1'},
{u'id': 2, 'name': 'Item 2', 'category_name': u'Cat 1'},
{u'id': 3, 'name': 'Item 3', 'category_name': u'Cat 1'},
{u'id': 4, 'name': 'Item 4', 'category_name': u'Cat 2'},
{u'id': 5, 'name': 'Item 5', 'category_name': u'Cat 2'},
{u'id': 6, 'name': 'Item 6', 'category_name': u'Cat 2'},
{u'id': 7, 'name': 'Item 7', 'category_name': u'Cat 3'},
{u'id': 8, 'name': 'Item 8', 'category_name': u'Cat 3'},
{u'id': 9, 'name': 'Item 9', 'category_name': u'Cat 3'}]

のドキュメントに目を通しました。 逆方向の関係 のドキュメントを読みましたが、これは逆でないフィールドと同じ結果になるようです。 私は何か明らかなことを見逃しているのでしょうか?

どのように解決するのですか?

を設定せずに、関連するフィールドを使用するだけです。 many=True .

という名前の出力が必要であることにも注意してください。 category_name という名前の出力が欲しいのに、実際のフィールドは category である場合は source の引数をシリアライザー・フィールドに与える必要があります。

以下のようにすれば、必要な出力が得られるはずです...

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.RelatedField(source='category', read_only=True)

    class Meta:
        model = Item
        fields = ('id', 'name', 'category_name')