我正在学习Django Rest Framework,并成功创建了一些API。现在我试图序列化一个关系模型,但我不知道如何操作。下面是我的代码。
class Countries(models.Model):
country = models.CharField(max_length=255)
class Meta:
managed = False
db_table = 'countries'
class Users(models.Model):
name = models.CharField(max_length=255)
email = models.CharField(max_length=255)
country = models.ForeignKey(Countries, models.DO_NOTHING)
date = models.DateTimeField()
class Meta:
managed = False
db_table = 'users'
在views.py中
def get(self,request):
print(UsersSerializer)
users = Users.objects.all()
serializer = UsersSerializer(users,many = True)
return Response(serializer.data)
序列化器。
class UsersSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
当我运行API时,我得到的是
[
{
"id": 3,
"name": "dsadasd",
"email": "[email protected]",
"date": "2020-05-12T12:15:24Z",
"country": 1
}
]
在国家字段中,我得到的是国家 id
我期待着这里的国家名称......
你可以使用 source
字段参数来检索 country
而非 id
:
.或可使用点号来遍历属性,例如:
EmailField(source='user.email')
. 当用点符号序列化字段时。在属性遍历过程中,如果任何对象不存在或为空,可能需要提供一个默认值。
因此,你的序列化器应该是这样的。
class UsersSerializer(serializers.ModelSerializer):
country = serializers.CharField(source='country.country', default='')
class Meta:
model = Users
fields = ('id', 'name', 'email', 'date', 'country')
# You may use fields='__all__' but I find the explicit declaration
# more flexible.
你需要改变你的 UsersSerializer
返回国家名称而不是ID。
class UsersSerializer(serializers.ModelSerializer):
country = serializers.SerializerMethodField() # add this line
class Meta:
model = Users
fields = '__all__'
def get_country(self, instance):
return instance.country.country # return country name
进一步阅读 序列器方法场.