【问题标题】:Django DatabaseError "more than one row returned by a subquery used as an expression" Editable related fields to objectDjango DatabaseError“用作表达式的子查询返回的不止一行”可编辑的相关字段到对象
【发布时间】:2013-08-06 19:20:59
【问题描述】:

我正在尝试将内联添加到我的模板中,但仍然出现数据库错误:

 more than one row returned by a subquery used as an expression

我的 models.py 中有 3 个相互关联的对象。用户将能够看到选择了哪个教师并列出了该教师下的所有所有者(教师和所有者将仅显示为不可编辑的列表)。我想列出所有者下的所有宠物并进行编辑。关于我为什么收到此错误的任何想法?以及如何才能实现我的目标?

models.py

class Teacher(models.Model):
        teacher = models.CharField(max_length=300)

class Owner(models.Model):
       relevantteacher = models.ForeignKey(Teacher)     
       owner = models.CharField(max_length=300)

class PetName(models.Model):
        relevantowner = models.ForeignKey(Owner)
        pet_name = models.CharField(max_length=50)

forms.py

class OwnerForm(forms.ModelForm):
    class Meta:
       model = Owner

PetNameFormSet = inlineformset_factory(Owner,
    PetName,
    can_delete=False,
    extra=3,
    form=OwnerForm)

views.py

def petname(request, teacher_id):
   teacher = get_object_or_404(Teacher, pk=teacher_id)

   owners = Owner.objects.filter(relevantteacher=teacher_id)

   if request.method == "POST":
      petNameInlineFormSet = PetNameFormSet(request.POST, request.FILES, instance=owners)

      if petNameInlineFormSet.is_valid():
         petNameInlineFormSet.save()

         return HttpResponseRedirect(reverse('success'))

   else:
      petNameInlineFormSet = PetNameFormSet(instance=owners) //error might be here?

   context = {'teacher': teacher, 'owners': owners, 'petNameInlineFormSet' : petNameInlineFormSet}
   return render(request, 'petname.html', context)

更新:

这是回溯:

File "hde/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.  response = callback(request, *callback_args, **callback_kwargs)
File "/views.py" in petname
  60.  petNameInlineFormSet = PetNameFormSet(instance=owners)
File "lib/python2.7/site-packages/django/forms/models.py" in __init__
  697.  queryset=qs, **kwargs)
File "lib/python2.7/site-packages/django/forms/models.py" in __init__
  424.  super(BaseModelFormSet, self).__init__(**defaults)

【问题讨论】:

  • 请指定发生错误的确切行号。
  • 我添加了回溯。这是你想要的吗?
  • PetNameFormSet(instance=owners) 我认为问题出在此处,因为您正在传递多个所有者,但实例应该作为单个模型对象给出,例如instance=owner_obj
  • 你说得对,阿米尔。我将实例更改为教师,这将消除错误。但是,由于该实例与 Pets 的所有者无关,因此不会填充 Pet 值。 Pet 内联也不与所有者相关联。有什么建议?还是我应该提出一个新问题?
  • 您需要传递所有者对象而不是教师对象作为实例,因为您的inlineformset_factoryOwner 组成。

标签: database django


【解决方案1】:

我相信您的错误出现在 views.py 文件的第二行。当您尝试在模板中指定 teacher.id 时,我相信这是对 get_object_or_404 方法的调用导致错误。对get_object_or_404 方法的调用从数据库返回多于一行,因此无法从多行调用teacher.id

【讨论】:

  • 模型定义中无需显式指定主键。如果未提供,Django 会自动创建自动增量字段作为主键。
  • 如果教师、所有者、宠物是不可编辑的列表,我能够让这段代码工作。但是,将 Pet 作为内联可编辑表单放入的那一刻,就引发了数据库错误。
【解决方案2】:

只需将 1 个对象传递给实例

owner = owners[0]

然后

instance=owner

但是,我一次只能添加/编辑 1 个主人的宠物名称。 感谢阿米尔的帮助!

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2017-10-09
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多