【问题标题】:django rest framework: SlugRelatedField options- limit by userdjango rest 框架:SlugRelatedField 选项 - 由用户限制
【发布时间】:2020-09-14 01:14:04
【问题描述】:

注意:我是 django rest 框架的新手。第一个项目。我的模型有一个外键,在我通过 SlugRelatedField 链接的序列化程序中。此相关模型是一个可供选择的选项的小列表,但可供选择的选项取决于用户(或更具体地说是用户组)。

我找到了this 问题,该问题说明了如何让用户进入 serilaizer。但这似乎没有帮助,因为字段定义是静态的,对吧?

删除我拥有的不相关部分:

class MyModelSerializer(serializers.ModelSerializer):

        sequence =  serializers.SlugRelatedField(
        many=False,
        read_only=False,
        slug_field='prefix',
        queryset=Sequence.objects.filter(active=True,
                sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=serializers.CurrentUserDefault()))
    )

这个查询可以正常工作,因为我也以正常形式使用它。当我开始开发时。服务器出现异常:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'CurrentUserDefault'

所以我的问题是如何让当前用户进入 SlugRelatedField 的查询集?

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    有趣的是,经过数小时的尝试,写下问题会导致一个可行的解决方案。

    1. 向 ModelViewSet 中的灭菌器上下文添加请求

      只需将以下方法添加到 ModelViewSet:

      def get_serializer_context(self):
          return {"request": self.request}
      
    2. 在Serializer的构造函数中调整SlugRelatedField的查询集

      def __init__(self, *args, **kwargs):
          super(MyModelSerializer, self).__init__(*args, **kwargs)
          # superuser can choose from all sequences, normal users can only choose from
          # active sequences he is assigned to
          request = self.context.get("request")
          if request and hasattr(request, "user"):
              sequence = self.fields['sequence']
              if request.user.is_superuser:
                  sequence.queryset = Sequence.objects.all()
              else:
                  sequence.queryset = Sequence.objects.filter(active=True,
                          sequence_groups__sequence_group_id__in=SequenceGroup.objects.filter(users=request.user))
      

    在我的情况下,管理员应该能够选择任何可用的选项,因此需要额外的条件。

    【讨论】:

      猜你喜欢
      • 2017-03-25
      • 2019-12-29
      • 2021-06-07
      • 2016-04-23
      • 2018-10-19
      • 1970-01-01
      • 2017-04-13
      • 2016-11-20
      • 2014-05-26
      相关资源
      最近更新 更多