【问题标题】:django view error: more than one row returned by a subquery used as an expressiondjango视图错误:用作表达式的子查询返回多行
【发布时间】:2012-03-28 16:55:20
【问题描述】:

我正在尝试创建一个视图来更新模型。该模型具有多对多关系。我在表单中使用 ModelMultipleChoiceField 查询 m2m 表以获取值列表。我希望能够在更新记录时更新/更改记录上的 m2m 属性。当我提交此表单(更新)时,我得到 ​​p>

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

我希望有多个值,但我的代码没有处理它。

感谢您的帮助。

Models.py

class Activities(models.Model):
    user = models.ForeignKey(User)
    url = models.ForeignKey(Link)
    name = models.CharField(max_length=60)
    desc = models.CharField(max_length=250)
    created = models.DateTimeField(auto_now_add=True)
    done = models.BooleanField(default=False)
    def __unicode__(self):
        return u'%s' % (self.link.url)

class Groups (models.Model):
    group = models.CharField(max_length=64)
    desc = models.CharField(max_length=250)
    created = models.DateTimeField(auto_now_add=True)
    activity = models.ManyToManyField(Activities)
    active_yn = models.BooleanField(default=True)
    def __unicode__(self):
        return self.group

class ActivitiesForm(ModelForm):
    class Meta:
        model = Activities

class GroupsForm(ModelForm):
    class Meta:
        model = Groups

forms.py (我认为问题出在这里: group = forms.ModelMultipleChoiceField(queryset=Groups.objects.all(),

#Add/Replace data in Activity Save
    # radio buttons
choices = ( (1,'Yes'),(0,'No'),
          )



# activity groups
class ActivitySaveForm(forms.Form):
    url = forms.URLField(
        label=u'URL',
        widget=forms.TextInput(attrs={'size': 64})
    )
    name = forms.CharField(
        label=u'Activity Name',
        widget=forms.TextInput(attrs={'size': 64})
    )  
    desc = forms.CharField(
        label=u'Describe it',
                widget=forms.TextInput(attrs={'size': 250})
    )
    group = forms.ModelMultipleChoiceField(queryset=Groups.objects.all(), required=True, widget=forms.CheckboxSelectMultiple
    )
    done = forms.TypedChoiceField(choices=choices, widget=forms.RadioSelect, coerce=int
    )   

views.py 第二个问题是:我如何使用 Groups.objects.get_or_create(id=group) 如果我不想返回 id 但想在模型中返回不同的值( Groups.group)。

def activity_save_page(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ActivitySaveForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            url, dummy = Link.objects.get_or_create(
                url=form.cleaned_data['url']
            )   
            act, created = Activities.objects.get_or_create(
                user=request.user,
                url=url
            )                                              
            act.desc = form.cleaned_data['desc']
            if not created:
                act.groups_set.clear()
            group = form.cleaned_data['group']
            for groups in group:
                group, dummy = Groups.objects.get_or_create(id=group)
                act.groups_set_add(group)
            act.save()
            return HttpResponseRedirect(
                '/user/%s/' % request.user.username
            )
    else:
        form = ActivitySaveForm()
    variables = RequestContext(request, {
        'form': form
    })
    return render_to_response('activity_save.html', variables)

最后,如果你需要的话,回溯。

Request Method: POST
Request URL: http://127.0.0.1:8000/activity_save/

Django Version: 1.3.1
Python Version: 2.7.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'poc.location',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'south']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/footbook/webapps/fb/poc/../poc/location/views.py" in activity_save_page
  327.                 group, dummy = Groups.objects.get_or_create(id=group)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in get_or_create
  135.         return self.get_query_set().get_or_create(**kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in get_or_create
  378.             return self.get(**lookup), False
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in get
  344.         num = len(clone)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in __len__
  82.                 self._result_cache = list(self.iterator())
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in iterator
  273.         for row in compiler.results_iter():
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in results_iter
  680.         for rows in self.execute_sql(MULTI):
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in execute_sql
  735.         cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py" in execute
  34.             return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/base.py" in execute
  44.             return self.cursor.execute(query, args)

Exception Type: DatabaseError at /activity_save/
Exception Value: more than one row returned by a subquery used as an expression

我认为我获取数据的方法有误,但不确定我应该使用什么。有关此错误的信息很多,但我找不到适合此需求的解决方案。感谢您的帮助。

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    回溯表明问题出在这里:

    File "/home/footbook/webapps/fb/poc/../poc/location/views.py" in activity_save_page
    327. group, dummy = Groups.objects.get_or_create(id=group)
    

    我认为问题在于您以令人困惑的方式使用“组”和“组”。您实际上从未在任何地方使用“组”

    group = form.cleaned_data['group'] <--- first you set group to a list from your form
    for groups in group: <--- then you use 'groups' to indicate *one* group from the list
        group, dummy = Groups.objects.get_or_create(id=group) <-- then you assign the list to the 'id' parameter.
    

    你是不是这个意思:

    groups = form.cleaned_data['group']
    for group in groups:
        this_group, dummy = Groups.objects.get_or_create(id=group)
        # do something with this_group
    

    如果不仔细查看您的代码,我不知道这是否真的适用于您正在做的事情。

    【讨论】:

    • 谢谢艾伦 - 就是这样。我更改了一些名称以避免混淆并且能够解决。
    • @jabs:太好了。很高兴我能帮上忙。如果它解决了您的问题,您可能想接受答案。谢谢。
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多