如何在DRF中创建基于Id的PUT / POST但响应中的详细信息?

时间:2017-07-10 09:35:46

标签: django rest django-rest-framework

我的情况是模型有一个带有详细信息的外键。防爆。有两种模式

class Person(models):
    country = models.ForeignKey(Country)

class Country(models):
    name = models.CharField(max_length=100)

假设事先已创建了国家/地区。现在,我希望Person的API仅在country Id个请求中使用POST/PUT,但返回该国家/地区的详细信息,而不是仅返回ID。

Request
{
   "id": 1,
   "country": 9
}
Response
{
   "id": 1,
   "country": {
       "id": 9,
       "name": "Some Country"
    }
}

我正在使用Django Rest Framework。 (我可以编写序列化程序,在读取和写入API中取id或取整个国家/地区对象)

1 个答案:

答案 0 :(得分:1)

您可以为此用户编写自定义字段CountryField,并使用用户to_representation方法返回对象详细信息:

class CountryDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields = ('id', 'name')

class CountryField(serializers.PrimaryKeyRelatedField):
    def to_representation(self, value):
        country = models.Barcode.objects.get(pk=value.pk)
        serializer = CountryDetailSerializer(country)
        return serializer.data

    def get_queryset(self):
        return Country.objects.all()

在Person serializer中使用它:

class PersonSerializer(serializers.ModelSerializer):
    country = CountryField()