python - 如何在 Django Rest Framework 中获取模型方法的值?
问题描述
所以基本上我有一个 django 模型,它有一个 ManyToManyField 朋友和两个在其上运行的方法。这是我的文件:
模型.py:
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
first_name = models.CharField(max_length=50, blank=True)
last_name = models.CharField(max_length=50, blank=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
friends = models.ManyToManyField(User, blank=True, related_name='friends')
def friends_list(self):
return self.friends.all()
def number_of_friends(self):
return self.friends.all().count()
序列化器.py:
from rest_framework import serializers
from .models import Profile
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'
视图.py:
from rest_framework import viewsets, permissions
from .models import Profile
from .serializers import ProfileSerializer
class ProfileViewSet(viewsets.ModelViewSet):
queryset = Profile.objects.all()
permission_classes = [
permissions.AllowAny
]
serializer_class = ProfileSerializer
问题是在 Api 中,方法的返回值不存在。例如,friends_list 方法应该返回您拥有的朋友列表,即使这在传统的 django 项目中确实有效,但 Django Rest Framework 并未显示此方法的任何价值。如何解决这个问题并让这两种方法的返回值显示在 api 中?
解决方案
由于模型序列化程序只为序列化程序字段选择模型字段,因此您不会自动复制任何方法。
您仍然可以通过参考模型方法显式添加两个字段来通过 API发送此只读数据
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = [
# need to explicitly define all fields I believe
'friends_list',
'number_of_friends',
]
既然声明了两个字段(与方法名称匹配,DRF 应该为每个字段创建SerializerMethodField
或ReadOnly
字段(不确定是哪一个,但它们相似)。它可以工作,因为它将这些字段的源设置为相同的名称,如果在模型上找到一些属性(在这种情况下是方法)。
如果这不起作用,您可以
class ProfileSerializer(serializers.ModelSerializer):
friends_list = serializers.SerializerMethodField()
number_of_friends = serializers.SerializerMethodField()
class Meta:
model = Profile
fields = [
# need to explicitly define all fields I believe
'friends_list',
'number_of_friends',
]
def get_friends_list(self, instance):
return instance.friends_list()
def get_number_of_friends(self, instance):
return instance.number_of_friends()
推荐阅读
- amazon-web-services - 从 Athena 获取数据并粘合权限
- spring - 如何实现支持 Spring 分页的 feign 请求?
- sccm - 查询 AD 以查找 OU 中用户正在使用的计算机
- ruby-on-rails - 我无法访问 rails 控制台
- java - 比较 JSON 和数组
- json - 无法从 JSON API 获取数据
- mysql - 如何在 MySQL 中搜索作为值的子字符串的行?
- javascript - 在页面上的所有脚本完全加载后运行 js 函数
- c# - NUnit 全局 SetupFixture 未执行
- hadoop - 将没有引号的字符串数据加载到 Hive