繁体   English   中英

获取 django.db.utils.OperationalError:子选择返回 11 列 - 尝试将 object 添加到 m2m 字段时预期为 1

[英]Getting django.db.utils.OperationalError: sub-select returns 11 columns - expected 1 when trying to add an object to a m2m field

I am new to django rest framework, and I am trying to build api for a todo app using which i can add collaborator to a todo my todo model is as follows:

class Todo(models.Model):
creator = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=255)
collaborators = models.ManyToManyField(User,related_name='collaborators')
def __str__(self):
    return self.title

序列化程序.py

class TodoCreateSerializer(serializers.ModelSerializer):
def save(self, **kwargs):
    data = self.validated_data
    user = self.context['request'].user
    title = data['title']
    todo = Todo.objects.create(creator=user, title=title)
    return todo

    class Meta:
    model = Todo
    fields = ('id', 'title',)


class UserObjectSerializer(serializers.ModelSerializer):

    class Meta:
    model = User
    fields = ['username']

class TodoSerializer(serializers.ModelSerializer):
    collaborators = UserObjectSerializer(many=True, required = False)
    class Meta:
        model = Todo
        fields = ['id', 'title', 'collaborators']

class CollaboratorSerializer(serializers.ModelSerializer):
    collaborators = UserObjectSerializer(many=True)
    class Meta:
        model = Todo
        fields = ['collaborators']

当我尝试在视图集中使用以下方法将协作者 object 添加到我的协作者字段时

class CollaboratorViewSet(viewsets.ModelViewSet):
serializer_class = CollaboratorSerializer
queryset=Todo.objects.all()
@action(methods=['put'], detail=True, permission_classes=[permissions.IsAuthenticated, ], url_path='add-collaborator', url_name='add_collaborator')
def add_collaborator(self, request, pk=None):
    try:
        todo = Todo.objects.get(pk=pk)
    except Exception:
        return Response({'Error':'Invalid Id'})
    else:
        if request.user == todo.creator:
            try:
                collborators = request.data["collaborators"]
            except KeyError:
                return Response({'Error':'Collaborator field not specified in request'}, status = status.HTTP_400_BAD_REQUEST)
            else:
                collab_list = []
                for collab in collborators:
                    try:
                        collab_name = collab['username']
                    except KeyError:
                        return Response({'Error':'No username provided'}, status = status.HTTP_400_BAD_REQUEST)
                    else:
                        new_collab = User.objects.filter(username=collab_name)
                        if new_collab:
                            collab_list.append(new_collab)
                        else:
                            return Response({'detail':'No user with provided username exists'}, status = status.HTTP_400_BAD_REQUEST)
                todo.collaborators.add(*collab_list)
                return Response({'Success':'Added collaborators successfully'}, status=status.HTTP_200_OK)
        else:
            raise PermissionDenied("You are not the creator of this Todo.")
@action(methods=['patch'], detail=True, permission_classes=[permissions.IsAuthenticated, ], url_path='delete-collaborator', url_name='delete_collaborator')

我收到一个错误 django.db.utils.OperationalError: sub-select 返回 11 列 - 预期为 1 但是当我使用 todo.collaborators.set(collaborator_object) 时添加了协作者,但这样我只能添加一个协作者并且没有效果当我尝试添加多个协作者时发生。 我知道我们可以使用.add() 方法将多个 object 添加到 m2m 关系字段,但是当我尝试添加一个 object 时,这不起作用,我还查看了 for.add() 方法的文档,但找不到任何帮助。

抱歉问了这么长的问题,并感谢您提前提供帮助!

我设法解决了这个错误,实际上我正试图以

new_collab = User.objects.filter(username=collab_name)

即使有一个具有给定用户名的唯一用户,它也会返回一个查询集,然后我试图将协作者直接添加到协作者字段,这导致了这个错误,因为它期望一个用户实例,但我提供了一个查询集以避免我刚刚替换了上面的线为

new_collab = User.objects.get(username=collab_name)

如果存在,它将返回一个用户 object 实例,因此不会引发错误,并且我可以添加多个以及单个协作者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM