我有一个班级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)
我写了Serializer
和View
,如:
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
。我怎么能这样做?
答案 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