[英]Django Rest Framework how to serialize a relational Model?
I am learning Django Rest Framework and creating some APIs with success.我正在学习 Django Rest 框架并成功创建了一些 API。 Now I am trying to serialize a relation, but I don't know how this works.
现在我正在尝试序列化一个关系,但我不知道它是如何工作的。 Here is my code:
这是我的代码:
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'
In views.py在views.py
def get(self,request):
print(UsersSerializer)
users = Users.objects.all()
serializer = UsersSerializer(users,many = True)
return Response(serializer.data)
Serializer:序列化器:
class UsersSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
When I run the API I am getting当我运行 API 时,我得到了
[
{
"id": 3,
"name": "dsadasd",
"email": "dasd@gmail.com",
"date": "2020-05-12T12:15:24Z",
"country": 1
}
]
In the country field I am getting country id
and I was expecting the country name here...在国家/地区字段中,我正在获取国家/地区
id
,并且我期待这里的国家/地区名称......
you need to change your UsersSerializer
to return country name insread of id.您需要更改您的
UsersSerializer
以返回国家/地区名称 insread 的 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
Further read SerializerMethodField .进一步阅读SerializerMethodField 。
You can use the source
field argument to retrieve the country
instead of the id
:您可以使用
source
字段参数来检索country
而不是id
:
... or may use dotted notation to traverse attributes, such as
EmailField(source='user.email')
....或者可以使用点符号来遍历属性,例如
EmailField(source='user.email')
。 When serializing fields with dotted notation, it may be necessary to provide a default value if any object is not present or is empty during attribute traversal.使用点分符号序列化字段时,如果在属性遍历期间任何 object 不存在或为空,则可能需要提供默认值。
Therefore your serializer should look like this:因此,您的序列化程序应如下所示:
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.