DRF,将自定义字段添加到 ModelSerializer
Posted
技术标签:
【中文标题】DRF,将自定义字段添加到 ModelSerializer【英文标题】:DRF, add custom field to ModelSerializer 【发布时间】:2019-01-01 22:50:28 【问题描述】:我的项目中有一些模型,我需要 API 的特殊响应,我正在使用 Django Rest 框架。
class Goal(models.Model):
name = models.CharField()
# more fields
class Task(models.Model):
name = models.CharField()
goal = models.ForeignKey(Goal)
class UserTask(models.Model):
goal = models.ForeignKey(Goal)
user = models.ForeignKey(User)
# other fields
我有这样的回应:
"name": "One goal",
"task": [
"name": "first task"
,
"name": "second tas"
]
但我需要这个:
"name": "One goal",
"task": [
"name": "first task",
"is_in_usertask": true
,
"name": "second tas",
"is_in_usertask": false
]
我看到了this in DRF docs,但我不知道如何按当前用户(或 URL 参数中给出的其他用户)和每个 Goal
过滤 UserTask
。
编辑:
# serializers
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
class GoalSerializer(serializers.ModelSerializer):
# related_name works fine
tasks = TaskSerializer(many=True)
class Meta:
model = Goal
【问题讨论】:
你能添加你的序列化器吗? 另外,is_in_usertask
变成True/False
背后的逻辑是什么?
当当前用户和Task
在UserTask
是True
时
我不明白 :(
如果当前登录的用户和Task
在UserTask
,那么is_in_usertask
应该是true
,否则应该是false
【参考方案1】:
尝试使用SerializerMethodField
字段作为
class TaskSerializer(serializers.ModelSerializer):
is_in_usertask = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Task
fields = ('name', 'is_in_usertask')
def get_is_in_usertask(self, task):
return UserTask.objects.filter(user=self.context['request'].user, goal=task.goal).exists()
【讨论】:
我试过这个,但我不知道如何访问用户实例。我会试试这个。获取url参数的方法是一样的吗? Serializer 的,context
默认包含少量数据,即request
和view
。 Django 具有通过request.user
属性获取登录用户的功能
URL 参数是请求对象的属性。这意味着只要上下文具有请求实例,就可以从您的序列化程序访问它【参考方案2】:
看看这个对话:How to get Request.User in Django-Rest-Framework serializer?
你不能直接访问 request.user
【讨论】:
以上是关于DRF,将自定义字段添加到 ModelSerializer的主要内容,如果未能解决你的问题,请参考以下文章
使用 paypal 节点 sdk 将自定义字段添加到计费协议
Drupal,Ubercart - 将自定义字段添加到结帐表单