代码之家  ›  专栏  ›  技术社区  ›  GluePear

在django rest框架中指定相关字符串字段

  •  0
  • GluePear  · 技术社区  · 6 年前

    Django 1.11,Django REST框架3.6。

    我有两个型号, Foo Bar :

    class Foo(models.Model):
        name=models.CharField()
        sex=models.CharField()
    
    class Bar(models.Model):
        type=models.CharField()
        foo=models.ForeignKey(Foo)
    

    在我的 serializers.py 我有:

    class FooSerializer(serializers.ModelSerializer):
        class Meta:
            model = Foo
            fields = ('sex',)
    
    class BarSerializer(serializers.ModelSerializer):
        foo = FooSerializer(many=False)
        class Meta:
            model = Bar
            fields = ('type', 'foo',)
    

    这会产生这样的JSON:

    {
      "type": "abcdefg",
      "foo": {
        "sex": "male"
      }
    }
    

    我真正想要的是让“foo”字段变平,即:

    {
      "type": "abcdefg",
      "foo": "male"
    }
    

    一种可能的解决方案是使用 StringRelatedField 但这需要设置 __str__ 方法 模型返回 sex 字段,我不想要。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ngoc Pham    6 年前

    你可以试试 SerializerMethodField 而不是。

    class BarSerializer(serializers.ModelSerializer):
        foo = serializers.SerializerMethodField()
    
        @staticmethod
        def get_foo(item):
            if item.foo:
               return item.foo.sex
    
        class Meta:
            model = Bar
            fields = ('type', 'foo',)
    
        2
  •  1
  •   Daniel Roseman    6 年前

    更简单的选择是使用 SlugRelatedField ,可以指向任何字段。

    class BarSerializer(serializers.ModelSerializer):
        foo = SlugRelatedField(slug_field='sex')
        class Meta:
            model = Bar
            fields = ('type', 'foo',)