Django - 用作表达式的子查询返回的不止一行

Posted

技术标签:

【中文标题】Django - 用作表达式的子查询返回的不止一行【英文标题】:Django - more than one row returned by a subquery used as an expression 【发布时间】:2017-10-09 03:49:22 【问题描述】:

由于某种原因,我在服务器上收到此错误:

用作表达式的子查询返回多于一行

在这一行:

asoc = Association.objects.get(id=asoc_pk)(在代码下方注释)

但是当我在 localhost 中运行它时,它工作得很好。

在没有帮助的情况下一直在这里寻找类似的解决方案。

希望您能看到其他我想不出来的解决方案。

还是新手,感谢您的帮助,伙计们!


models.py

class Administrator(AbstractUser):
   ...
   association= models.ForeignKey(Association)


   class Meta:
       db_table = 'Administrator'



class Association(models.Model):
   asoc_name = models.CharField(max_length=100)
   ...


   class Meta:
       db_table = 'Association'

views.py

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if not form.is_valid():
            return render(request, 'admin/signup.html',
                          'form': form)

        else:
            ...
            asoc_pk = Association.objects.filter(asoc_name=request.user.association)
            asoc = Association.objects.get(id=asoc_pk)    **#ERROR here but why?**
            ...
            Administrator.objects.create_user(...
                                              association=asoc,    
                                              ...)
            user = authenticate(...
                                association=asoc,
                                ...)
            return redirect('/')

    else:
        return render(request, 'admin/signup.html',
                      'form': SignUpForm())

【问题讨论】:

【参考方案1】:
        asoc_pk = Association.objects.filter(asoc_name=request.user.association)
        asoc = Association.objects.get(id=asoc_pk)    **#ERROR here but why?**

因为您的关联模型不会对 asoc_name 属性强制执行唯一约束。因此,很可能有多个记录与request.user.association 匹配。解决方案是使该列独一无二。不过,您必须先清除重复项(这里有很多关于如何清除重复项的答案)

【讨论】:

那记得把filter改成get,像这样:"asoc_pk = Association.objects.get(asoc_name=request.user.association)" @e4c5 - 非常感谢!几天来一直在为这个问题而苦苦挣扎。总是有新东西要学习,很抱歉耽搁了。 @danihp - 没必要,不用改变它就可以正常工作。欣赏建议=D 嗨,我将删除 cmets 简而言之以保持网站清洁。谢谢。 很高兴能帮上忙。祝您的项目一切顺利

以上是关于Django - 用作表达式的子查询返回的不止一行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子查询的多行返回值插入表中?

SQL问题,子查询返回的值不止一个!

子查询返回的值不止一个.当子查询跟随在 =,!=,<,<=,>,>= 之后,或子查询用作

sql 问题子查询返回的值不止一个。

sqlserver 表 无法更新和删除 子查询返回的值不止一个

SQL之子查询