【发布时间】: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_factory由Owner组成。