【问题标题】:how to add values to a ManyToManyField如何将值添加到 ManyToManyField
【发布时间】:2021-01-04 11:28:02
【问题描述】:

我有以下模型,它有一个名为 who_can_see 的字段,我不知道如何向该字段添加数据,也不知道数据的类型(字典、数组...)

#modles.py
class Author(models.Model):
    name = models.CharField(max_length=200)
    added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    created_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.name


class Book(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=300)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    added_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    created_date = models.DateTimeField(default=timezone.now)
#????
    who_can_see = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name='tweet_user', blank=True)

    def __str__(self):
        return self.title

  • 你可以在这里看到我在哪里添加????,我正在尝试who_can_see= [author, payload["who_can_see"]],所以我希望字段who_can_see 是一个数组,但是当我发出POST 请求时,我得到500 错误

@api_view(["POST"])
@csrf_exempt
@permission_classes([IsAuthenticated])
def add_book(request):
    print({"request.data": request.data})
    payload = request.data
    user = request.user
    try:
        author = Author.objects.get(id=payload["author"])
        book = Book.objects.create(
            title=payload["title"],
            description=payload["description"],
            added_by=user,
            author=author,
            # who_can_see= [author, payload["who_can_see"]]  # ????
        )
        serializer = BookSerializer(book)
        return JsonResponse({'books': serializer.data}, safe=False, status=status.HTTP_201_CREATED)
    except ObjectDoesNotExist as e:
        return JsonResponse({'error': str(e)}, safe=False, status=status.HTTP_404_NOT_FOUND)
    except Exception:
        return JsonResponse({'error': 'Something terrible went wrong'}, safe=False, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您应该首先创建图书,然后添加who_can_see 属性。就像documentation上的例子一样

    你的情况几乎很好。它看起来像:

    def add_book(request):
        print({"request.data": request.data})
        payload = request.data
        user = request.user
        try:
            author = Author.objects.get(id=payload["author"])
            book = Book.objects.create(
                title=payload["title"],
                description=payload["description"],
                added_by=user,
                author=author,
            )
            book.who_can_see.add(author) 
            serializer = BookSerializer(book)
            return ...
    

    编辑:我意识到您的模型与您的观点不一致。为什么将 who_can_see 链接到 AUTH_USER_MODEL 而不是 Author ?根据您的观点,您的模型应该是:

    who_can_see = models.ManyToManyField(Author,related_name='tweet_user', blank=True)
    

    【讨论】:

    • 如果你注意到# who_can_see= [author, payload["who_can_see"]] # ? 我正在尝试添加许多用户payload["who_can_see"] 不仅是作者,还包括request.data 附带的其他用户
    • 这是行不通的:您必须先通过使用 id 进行查询来获取对象 Author。
    • 我试过这个book.who_can_see.add(author.id, 2,3]) 并且它工作但book.who_can_see.add(author.id, payload["who_can_see"]) 这不起作用,因为返回一个数组,如何让它只返回这样的数字,我可以把它变成一个字符串然后转换用逗号,
    • 问题在于 payload["who_can_see"] :您需要将其转换为整数列表。我想它目前是一个字符串或字符串列表
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2023-03-15
    • 2020-11-26
    • 1970-01-01
    • 2019-01-04
    • 2014-02-21
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多