添加ManytoManyField破坏了Django

杰森·B

在我的项目中,我有一个模型Project,该模型在保存时会创建另一个模型Access,其中包含manytomanyfield access_list,用户可以在其中将其他用户作为协作者添加到他们的项目中。它可以正常工作-创建新项目时,我可以在其中添加其他用户,但是如果我添加第二个用户,它将不再为页面提供错误提示,

Exception Value: get() returned more than one Access -- it returned 2!"

如果我切换到已添加到项目中的帐户,然后使用该帐户添加其他用户,他们的添加效果很好,并且不会中断页面​​。

页面中断时,即使数据库中只有一个项目实例,它也会在我的“项目”页面上创建该项目的另一个实例。

我的代码:

Models.py:

class Project(models.Model):
    created_by = models.ForeignKey(User)

    super(Project, self).save()
    Access.objects.get_or_create(project=self)

class Access(models.Model):
    project = models.ForeignKey(Project)
    access_list = models.ManyToManyField(User)
    pubdate = models.DateTimeField(default=timezone.now)

Views.py:

@login_required 
def access(request, project_id=1):
thisuser = request.user
if Access.objects.filter(Q(access_list=thisuser) | Q(project__created_by=thisuser), project__id=project_id).exists():
        accesspermission = Access.objects.filter(Q(access_list=thisuser) | Q(project__created_by=thisuser), project__id=project_id).order_by('-project__project_pubdate')[0]
    else:
        accesspermission = None
    if Entry.objects.filter(project_id=project_id).exists():
        anyentries = Entry.objects.filter(project_id=project_id, entry_unique=1).order_by('-entry_pubdate')[0]
    else:
        anyentries = None
    if Entry.objects.filter(project_id=project_id, entry_unique=1).exists():
        firstentry = Entry.objects.filter(project_id=project_id, entry_unique=1).order_by('-entry_pubdate')[0]
    else:
        firstentry = None
    if Entry.objects.filter(project_id=project_id).exists():
        lastentry = Entry.objects.filter(project_id=project_id).order_by('-entry_pubdate')[0]
        lastentrynumber = lastentry.entry_unique
    else:
        lastentrynumber = None
if request.method == "POST":    
    form = AddAccessForm(request.POST)
    if form.is_valid():
        p = form.save(commit=False)

        adduserfromform = p.accessupdate
        if User.objects.filter(username=adduserfromform).exists():
            usertoadd = User.objects.get(username=adduserfromform)
            projecttoadd = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0]
            projecttoadd.access_list.add(usertoadd)
        else:
            usertoadd = None

        removeuserfromform = p.accessremove
        if User.objects.filter(username=removeuserfromform).exists():
            usertoremove = User.objects.get(username=removeuserfromform)
            projecttoremove = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0]
            projecttoremove.access_list.remove(usertoremove)
        else:
            usertoremove = None

        form.save()

        return HttpResponseRedirect('/projects/get/%s/access' % project_id)

追溯:

Traceback (most recent call last):
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/webapps/filmeditdb/filmeditdb/docproject/views.py", line 284, in access
    def access(request, project_id=1):
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/webapps/filmeditdb/local/lib/python2.7/site-packages/django/db/models/query.py", line 310, in get
    (self.model._meta.object_name, num))
MultipleObjectsReturned: get() returned more than one Access -- it returned 2!
2014-03-25 22:48:26 [17264] [INFO] Handling signal: winch
2014-03-25 22:48:26 [17264] [INFO] SIGWINCH ignored. Not daemonized
用户名

通常建议添加完整的回溯,但是从显示的错误出发,最有可能在此行出现此问题:

projecttoremove = Access.objects.get(project__id=project_id).order_by('-project__project_pubdate')[0]

Django总是希望返回1个对象。如果有0个对象,则引发异常;如果有多个,则引发异常。get() DoesNotExistMultipleObjectsReturned

更改该行以匹配此处的先前行:

projecttoadd = Access.objects.filter(project__id=project_id).order_by('-project__project_pubdate')[0]

如果失败,请识别错误的呼叫。您得到的异常非常清楚。在代码的某个点上,您正在Access.objects.get()使用一些参数进行调用,并且正在查找2个对象而不是1个对象。要么修复参数,要么可能将其切换为use filter()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

添加DocType破坏了我html的整个样式表

来自分类Dev

春季:添加基本URL破坏了JSON转换

来自分类Dev

添加 WEB API 方法破坏了我的 SWAGGER UI

来自分类Dev

Django 2.2破坏了以前的工作视图/ URL

来自分类Dev

PageTabViewStyle破坏了NavigationView

来自分类Dev

无法在 Django 中添加 ManyToManyField 对象

来自分类Dev

尝试将元组添加到列表中,并且添加了字符'破坏了代码

来自分类Dev

UI Bootstrap在<uib-tabset>指令周围添加了<div>,破坏了CSS

来自分类Dev

试图在 onClick 上为列表项添加删除线,但它破坏了我的提交按钮

来自分类Dev

嵌套的SplitContainers破坏了SplitterWidth

来自分类Dev

我破坏了封装吗?

来自分类Dev

.htaccess破坏了我的网站

来自分类Dev

InstallShield破坏了TFS构建

来自分类Dev

wget破坏了内容的配置

来自分类Dev

Serilog破坏了多个日志?

来自分类Dev

PHP输出破坏了Javascript

来自分类Dev

我已经破坏了Ubuntu!

来自分类Dev

导航被display:inline破坏了

来自分类Dev

Tkinter破坏了Toplevel的根源

来自分类Dev

PHP破坏了我的代码

来自分类Dev

icacls破坏了胜利10

来自分类Dev

Firebase模块破坏了Aurelia

来自分类Dev

扩展的 JPanel 破坏了 GridLayout

来自分类Dev

Bootstrap 4.3.1 破坏了 PopConfirm

来自分类Dev

Django使用add在对象为“ self”的地方添加ManyToManyField

来自分类Dev

Django在表单提交时将数据添加到manyToManyField

来自分类Dev

Django ManyToManyField 如何添加 created_at 和 updated_at

来自分类Dev

ProtoBuf在反序列化过程中破坏了字节数组(添加了0)

来自分类Dev

从localStorage加载HTML破坏了按钮的功能