我正在学习Python和Django并且出现了以下我无法解决的错误:
Exception Type: AttributeError
Exception Value: 'QuerySet' object has no attribute 'apellido'
(型号)
class Humano(models.Model):
nombre = models.CharField(max_length=30)
apellido = models.CharField(max_length=30)
def __unicode__(self):
return self.nombre
def apellido(self):
return self.apellido
(形式)
class formulario(forms.Form):
nombre = forms.CharField(max_length=30)
apellido = forms.CharField(max_length=30)
(视图)
def comparar(request):
if request.method == 'POST':
form = formulario(request.POST)
if form.is_valid():
objeto = Humano(
nombre = form.cleaned_data['nombre'],
apellido = form.cleaned_data['apellido'],
)
objeto2 = Humano.objects.all()
n = objeto2.apellido() # el error me marca esta linea
if n == objeto.apellido:
z = 'los apellidos son iguales'
else:
z = 'los apellidos son distintos'
return render_to_response('index.html', { 'z':z}, context_instance=RequestContext(request))
else:
form = formulario()
return render_to_response('index.html', {'form':form}, context_instance=RequestContext(request))
该视图的目的是比较通过表单收到的apellido,并将其与数据库中现有的其他数据进行比较。
答案 0 :(得分:1)
这里有几个问题:
由于objeto2
是一个查询集,您可以进行比较,
objeto = Humano(
nombre = form.cleaned_data['nombre'],
apellido = form.cleaned_data['apellido'],
)
objeto_qs = Humano.objects.all()
#Note that you dont need the call here.. Moreover, unless you have created a new manager named `appelidos`, the () call does not work
for n in objeto_qs:
if n.appellido == objeto.apellido:
z = 'los apellidos son iguales'
else:
z = 'los apellidos son distintos'
另一件事是,您没有保存创建的对象。这意味着一旦执行此功能,对象就会丢失。您可能需要考虑使用Humano.objects.create(..)
最后,您不必单独循环遍历对象。您可以像这样查询数据库:
if Humano.objects.filter(apellido=objeto.apellido).exists():
z = 'los apellidos son iguales'
else:
z = 'los apellidos son distintos'
答案 1 :(得分:0)
这里有一些可以改变的事情。
第一个是objeto2 = Humano.objects.all()
返回查询集的实际错误,因此它不会返回单个模型
在不了解西班牙语的情况下,我假设您正试图弄清楚数据库中的任何其他对象是否具有相同的apellido
。要执行此操作,您可以将filter
与exists
一起使用,它会告诉您是否存在。
any_apellido_exist = Humano.objects.filter(apellido=form.cleaned_data['apellido']).exists()
其次,您的整个表单都是重复字段并且难以维护,您可能需要考虑使用ModelForm
class formulario(forms.ModelForm):
class Meta:
model = Humano