python / django1.7出错(异常类型:AttributeError)

时间:2016-02-06 13:44:12

标签: python django

我正在学习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,并将其与数据库中现有的其他数据进行比较。

2 个答案:

答案 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。要执行此操作,您可以将filterexists一起使用,它会告诉您是否存在。

any_apellido_exist = Humano.objects.filter(apellido=form.cleaned_data['apellido']).exists()

其次,您的整个表单都是重复字段并且难以维护,您可能需要考虑使用ModelForm

class formulario(forms.ModelForm):
    class Meta: 
         model = Humano