代码之家  ›  专栏  ›  技术社区  ›  Souvik Ray

Django抛出“禁止直接分配到多对多集的前端。”错误

  •  0
  • Souvik Ray  · 技术社区  · 6 年前

    我在Django有两个模特 Users Contexts 。我已将模型定义如下

    class User(models.Model):
        userId = models.PositiveIntegerField(null = False)
        pic = models.ImageField(upload_to=getUserImagePath,null=True)
        Email = models.EmailField(null = True)
    
    class Contexts(models.Model):
        context_name = models.CharField(max_length=50)
        context_description = models.TextField()
        context_priority = models.CharField(max_length=1)
        users = models.ManyToManyField(User, related_name='context_users')
    

    现在我得到一个post请求,其中包含以下json

    {
    "user" : 12,
    "action" : "add",
    "context_name": "Network debug",
    "context_description" : "Group for debugging network issues",
    "context_priority": "L"
    }
    

    我想在 语境 下表是我要做的

    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_exempt
    from django.http import HttpResponse
    import json
    from .models import *
    import json
    
    
    @csrf_exempt
    def context_operation(request):
        if request.method == "POST":
            user_request = json.loads(request.body.decode('utf-8'))
            try:
                if user_request.get("action") == "add":
                    conv = Contexts.objects.create(
                        context_name=user_request.get("context_name"),
                        context_description=user_request.get("context_description"),
                        context_priority=user_request.get("context_priority"),
                        users=user_request.get("user")
                    )
                    conv.save()
            except Exception as e:
                print("Context saving exception", e)
                return HttpResponse(0)
            return HttpResponse(1)
    

    在这里,我试图基于json请求中的action字段添加一个上下文。 语境 模型,领域 users User 但是当我试图将值保存到 Contexts table ,我收到以下错误

    Context saving exception Direct assignment to the forward side of a many-to-many set is prohibited. Use users.set() instead.
    

    基于 this StackOverflow post ,我试着这样做:

    users=User.objects.add(user_request.get("user"))
    

    但我还是收到了同样的错误。我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Daniel Roseman    6 年前

    错误应该是清楚的;不能直接分配给多对多字段。创建项目后执行此操作。

    conv = Contexts.objects.create(
        context_name=user_request.get("context_name"),
        context_description=user_request.get("context_description"),
        context_priority=user_request.get("context_priority"),
    )
    conv.users.add(user_request.get("user"))
    

    另外请注意,你不需要打电话 save() 之后 create() 或者添加m2m值。