简体   繁体   English

Django Rest框架如何序列化一个关系Model?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM