【问题标题】:Django REST query: Retrieve UsersDjango REST 查询:检索用户
【发布时间】:2020-10-13 23:11:08
【问题描述】:

我希望检索当前用户(已给出 ID)的所有员工(用户)。员工是用户的多对多字段。目前我的查询检索当前用户。而 user.employees 只是返回所有员工的 id。

是否可以立即进行查询以检索当前用户的所有员工?或者我只是应该为每个用户发送更多的 API 调用(从前端),我通过 id 检索用户的数据?

如果有人能引导我朝着正确的方向前进,那就太棒了。 :)

views.py

# display all your employees
class EmployeeViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def list(self, request):
        queryset = User.objects.filter(pk=request.user.pk) #get current user
        serializer = UserSerializer(queryset, many=True) 
        return Response(serializer.data)

models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    employees = models.ManyToManyField(User, related_name='employees')

serializers.py

class UserSerializer(UserDetailsSerializer):

class Meta(UserDetailsSerializer.Meta):
    fields = UserDetailsSerializer.Meta.fields + ('employees')

def update(self, instance, validated_data):
    profile_data = validated_data.pop('userprofile', {})
    employees = profile_data.get('employees')

    instance = super(UserSerializer, self).update(instance, validated_data)

    # get and update user profile
    profile = instance.userprofile
    if profile_data:
        if employees:
            profile.employees = employees
        profile.save()
    return instance

rest_auth/serializers.py(依赖)

class UserDetailsSerializer(serializers.ModelSerializer):
    """
    User model w/o password
    """
    class Meta:
        model = UserModel
        fields = ('pk', 'username', 'email', 'first_name', 'last_name')
        read_only_fields = ('email', )

示例用户

【问题讨论】:

    标签: python django


    【解决方案1】:
    class EmployeeViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        def list(self, request):
            queryset = self.queryset.filter(id__in=request.user.employees.all())
            serializer = UserSerializer(queryset, many=True) 
            return Response(serializer.data)
    

    此外,在序列化程序中,您可能必须执行以下操作才能获得所需的响应结构。

    class UserSerializer(UserDetailsSerializer):
        employees = serializers.SerializerMethodField() 
    
        class Meta(UserDetailsSerializer.Meta):
            fields = UserDetailsSerializer.Meta.fields + ('employees')
    
        def get_employees(self, obj):
            return obj.userprofile.employees.all()
    
    

    【讨论】:

    • 得到以下错误:'AnonymousUser' 对象没有属性'employees'
    • 由于该用户尚未登录,request.user 返回一个 AnonymousUser 对象。 Django 将它们视为 AnonymousUser 并且 AnonymousUser 没有 employees 属性。检查这个:stackoverflow.com/a/23157859/2415394
    • @SJ19 你必须使用permission_classes
    • 你可以看这里,stackoverflow.com/questions/5376985/…,如果你能分享Auth逻辑,我们可以帮助调试......
    • 我的错,当我首先检索用户时,我仍然得到“'QuerySet' object has no attribute 'employees'”。
    【解决方案2】:

    您可以使用如下过滤器: request.user.userprofile.employees.all() 获取特定用户的员工。

    class EmployeeViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
    
        def list(self, request):
            queryset = request.user.userprofile.employees.all() #get all employees for current user
            serializer = UserSerializer(queryset, many=True) 
            return Response(serializer.data)
    

    This documention 关于一对一的关系也会很有用。

    【讨论】:

    • 这只是返回所有用户
    • 已更新,请尝试使用request.user.userprofile.employees.all()
    • 嗯返回空列表
    • 然后你可以创建一些 user 和 user_profile 对象然后再试一次。按照本文档创建对象会很有帮助。 docs.djangoproject.com/en/3.0/topics/db/examples/one_to_one/…
    • 我有 user/user_profile 对象,请查看我添加到帖子中的图片。
    猜你喜欢
    • 2017-08-23
    • 2012-01-04
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多