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 背后的逻辑是什么? 当当前用户和TaskUserTaskTrue 我不明白 :( 如果当前登录的用户和TaskUserTask,那么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 默认包含少量数据,即requestview。 Django 具有通过request.user 属性获取登录用户的功能 URL 参数是请求对象的属性。这意味着只要上下文具有请求实例,就可以从您的序列化程序访问它【参考方案2】:

看看这个对话:How to get Request.User in Django-Rest-Framework serializer?

你不能直接访问 request.user

【讨论】:

以上是关于DRF,将自定义字段添加到 ModelSerializer的主要内容,如果未能解决你的问题,请参考以下文章

Netsuite 将自定义字段添加到交易列字段

使用 paypal 节点 sdk 将自定义字段添加到计费协议

Drupal,Ubercart - 将自定义字段添加到结帐表单

php 将自定义字段内容添加到菜单项

Django Allauth - 如何将自定义 CSS 类添加到字段?

Relay/GraphQL 将自定义字段添加到连接