【问题标题】:Django - more than one row returned by a subquery used as an expressionDjango - 用作表达式的子查询返回的不止一行
【发布时间】: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()})

【问题讨论】:

    标签: django postgresql python-3.x django-models django-queryset


    【解决方案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 简而言之以保持网站清洁。谢谢。
    • 很高兴能帮上忙。祝您的项目一切顺利
    猜你喜欢
    • 2012-08-04
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多