Django休息框架Serialzer ForeignKeyField输出为field_id

时间:2016-02-20 04:14:49

标签: django python-2.7 python-3.x django-rest-framework

我有一个班级Course,该模型有一个外键category

class Course(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=128, unique=True)

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)

我写了SerializerView,如:

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course

class CourseViewSet(ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

当我发出get请求时,我得到的响应如下:

{
    'id':1,
    'category':1,
    'title': 'xxx'
}

但我真正想要的是:

{
    'id':1,
    'category_id':1,
    'title': `xxx`
}

我希望密钥为category_id而不是category。我试图在category_id中指定名称class Meta in CourseSerializer,但它不起作用。

我如何使代码按我的意愿工作?谢谢!

修改

另外,当提出创建课程实例的post请求时,我想发布如下数据:

{
    'category_id': 1,
    'title': 'xxx'
}

key也应为category_id。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

试试这个,
注意:缩进可能不正确

class CourseSerializer(serializers.ModelSerializer):
    category_id = serializers.SerializerMethodField()

    class Meta:
        model = Course
        exclude = ['category']

    def get_category_id(self, obj):
        return obj.category.id

    def create(self, validated_data):
        return Course.objects.create(**validated_data)

答案 1 :(得分:0)

听起来SlugRelatedField可能就是您所需要的:

class CourseSerializer(serializers.ModelSerializer):
    category_id = serializers.SlugRelatedField(slug_field='id',
                                               queryset=Category.objects.all())

    class Meta:
        model = Course
        fields = ('category_id',)

让我知道这是否有效!

答案 2 :(得分:0)

我得到了答案,我应该使用PrimaryKeyRelatedField,序列化器应该是这样的:

class CourseSerializer(serializers.ModelSerializer):
    category_id = serializers.PrimaryKeyRelatedField(source='category', queryset=Category.objects.all())
    class Meta:
        model = Course