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

Rub*_*bal 5 django rest django-rest-framework

我遇到的情况是模型具有带有详细信息的外键。例如 有两种模式

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

class Country(models):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

假设已经预先创建了国家。现在,我要为这些API Person采取只country IdPOST/PUT请求,但返回而不是只Id的那个国家的细节。

Request
{
   "id": 1,
   "country": 9
}
Response
{
   "id": 1,
   "country": {
       "id": 9,
       "name": "Some Country"
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Django Rest Framework。(我可以编写id同时包含读写API或整个国家对象的序列化器)

nev*_*ner 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()
Run Code Online (Sandbox Code Playgroud)

并在 Person 序列化器中使用它:

class PersonSerializer(serializers.ModelSerializer):
    country = CountryField()
Run Code Online (Sandbox Code Playgroud)