django rest framework:自定义嵌套的序列化程序

时间:2017-11-19 11:57:51

标签: django django-rest-framework

我有以下Django模型结构:

class TypeOfIngredient(models.Model):
    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)

class Ingredient(models.Model):
    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)
    typeofingredient = models.ForeignKey(TypeOfIngredient, related_name='typeof_ingredient',null=True, blank=True,on_delete=models.PROTECT)

串行:

class IngredientListSerializer(ModelSerializer):
    class Meta:
        model = Ingredient
        fields = '__all__'

使用上面的序列化程序,我看到以下api输出:

"results": [
        {
            "id": 1,
            "name": "adrak",
            "slug": "adrak",
            "typeofingredient": null
        },
        {
            "id": 2,
            "name": "banana",
            "slug": "banana",
            "typeofingredient": 1
        },

如何获取"typeofingredient": "fruit"其中fruit是typeofingredient的name字段。我得到的是身份证。

我试过嵌套:

class IngredientListSerializer(ModelSerializer):
    class Meta:
        model = Ingredient
        fields = '__all__'
        depth = 1

然后我得到api输出:

"results": [
        {
            "id": 1,
            "name": "adrak",
            "slug": "adrak",
            "typeofingredient": null
        },
        {
            "id": 2,
            "name": "banana",
            "slug": "banana",
            "typeofingredient": {
                    "id": 1,
                    "name": "fruit",
                    "slug": "fruit"
            }
        },

这里显示了typeofingredient的所有细节。而不是我可以直接"typeofingredient": "fruit"

2 个答案:

答案 0 :(得分:1)

使用 serializers.ReadOnlyField

class IngredientListSerializer(ModelSerializer):
    typeofingredient = serializers.ReadOnlyField(source='typeofingredient.name')    

    class Meta:
        model = Ingredient
        fields = '__all__'

答案 1 :(得分:1)

您可以在models.py

上添加 str 方法
class TypeOfIngredient(models.Model):
    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return str(self.name)

class Ingredient(models.Model):
    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)
    typeofingredient = models.ForeignKey(TypeOfIngredient, related_name='typeof_ingredient',null=True, blank=True,on_delete=models.PROTECT)