在Django中,类没有'objects'成员。

4
from django.http import HttpResponse
from .models import Destination
def index(request):
    boards = Destination.objects.all()
    boards_names = list()
    for Destination in boards:
     boards_names.append(Destination.destinationtext)
     response_html = '<br>'.join(boards_names)
     return HttpResponse(response_html)

我写了这段代码只是为了练习Django框架,但是通过pylint我得到了以下错误:

E1101:Class 'Destination' has no 'objects' member
E0601:Using variable 'Destination' before assignment

1
你写了 for Destination in ...,所以你已经 覆盖 了对该类的引用。 - Willem Van Onsem
2个回答

1
您有两个不同的问题,而不是您所说的一个问题: E1101:Class 'Destination' has no 'objects' member:这是一个警告,发生原因是因为pylint不知道我们特殊的Django变量。像pylint-django这样的pylint插件可能会解决这个问题。 E0601:Using variable 'Destination' before assignment:在代码中的for循环中,您定义了一个名为Destination的变量。这不仅是不好的实践,因为Python变量需要使用lowercase_underscore,而且它覆盖了Destination,这就是引起此错误的原因。您可能想要做这样的事情:
for d in boards:
# Or:
for destination in boards:

这与Pylint无关:这是一个真正的错误,因为由于循环中的for语句,它将 Destination 视为本地变量。 - Willem Van Onsem
@WillemVanOnsem 错误是“Destination”没有变量“objects”,这指的是在创建同名局部变量之前两行的“Destination.objects.all()”行。 - NonameSL
不,那只是Pylint的提示,但如果你运行它,它不会出错。 - Willem Van Onsem

1
你在视图中写道:

for <b>Destination</b> in boards:
    # ...

这意味着Python将Destination视为一个本地变量,一个在分配之前就被使用的本地变量。
您可以在循环中重命名变量来解决问题,但实际上您可以通过使用.values_list(..)使其更加优雅和快速。
from django.http import HttpResponse
from .models import Destination

def index(request):
    response_html = '<br>'.join(
        Destination.objects.<b>values_list('destinationtext', flat=True)</b>
    )
    return HttpResponse(response_html)

然而,我仍然不确定这是否解决了问题,因为destinationtext可能包含HTML标签,这将导致混乱。通常最好使用模板。


错误发生在 OP 声明该变量的前两行。这是一个问题,但不是 唯一的 问题。 - NonameSL
@NonameSL:当然那就是问题所在。你认为“在赋值前使用变量'Destination'”是什么意思? - Willem Van Onsem
看起来我们两个都是正确的,因为 OP 出现了两个错误:E1101: 类“Destination”没有“objects”成员E0601: 在赋值之前使用变量“Destination” - NonameSL
@NonameSL:但那只是两个PyLint的警告。Pylint会抱怨很多不会引发错误的东西,它只是想提高代码质量。 - Willem Van Onsem
真的,但问题的标题是“在Django中类没有'objects'成员”,这是OP认为他得到的错误。你是正确的,但我只是参考了OP认为他们得到的错误和第二个错误,正如你所说的不仅仅是一个警告,而是一个错误。 - NonameSL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接