Django Rest Framework如何序列化关系模型?

问题描述 投票: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 django-rest-framework django-serializer
2个回答
1
投票

您可以使用source字段参数来检索source而不是country

...或可以使用点号来遍历属性,例如id。当用点号符号序列化字段时,如果在属性遍历期间不存在任何对象或该对象为空,则可能需要提供默认值。

因此您的序列化器应如下所示:

EmailField(source='user.email')

1
投票

您需要更改您的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. 以返回对ID的国家/地区名称的误读。

UsersSerializer

进一步阅读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.