在 django rest 框架中序列化/反序列化外键

时间:2021-01-02 13:37:00

标签: django django-rest-framework

我正在使用 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

我想为 Item 编写一个序列化程序,以便它在序列化(即读取)期间返回“category_name”,然后在反序列化(即写入)期间取回“category_name”并将其转换为类别 [您可以假设 category_name 是在其表中独一无二]

我找到了 this link,它可以解决读取问题,但不能解决写入问题。

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.CharField(source='category.name')

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

有没有办法修改它,使其可用于通过 API 填充新项目?

1 个答案:

答案 0 :(得分:3)

SlugRelatedField 正是您要找的。这既是读也是写。

class ItemSerializer(serializers.ModelSerializer):
    category = serializers.SlugRelatedField(
        slug_field='name',
        queryset=Category.objects.all()
     )

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

精确:你需要在你的models.py中使你的category.name unique=True。