簡體   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