Django Rest Framework如何序列化一个关系型Model?

问题描述 投票:0回答:2

我正在学习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 我期待着这里的国家名称......

python django
2个回答
1
投票

你可以使用 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.

1
投票

你需要改变你的 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

进一步阅读 序列器方法场.

© www.soinside.com 2019 - 2024. All rights reserved.