如何覆盖 models.py 中的 __str__ ?

NBa*_*con 2 python django django-models

如果这是一个愚蠢的问题,我很抱歉,我对 python 和 django 还很陌生。

我正在学习 django 教程,我们正在创建一个假电影网站,按流派、标题等列出电影。

我目前正在尝试覆盖__str__models.py 文件中的函数,因此它不会显示流派 (1),而是显示实际流派(例如“动作”)。

这是我的 models.py 目前的样子:

from tkinter import CASCADE
from django.db import models
from django.utils import timezone

# Create your models here.
class Genre(models.Model):
    name = models.CharField(max_length=255)

    def __str__ (self):
        return self.name

class Movie(models.Model):
    title = models.CharField(max_length=255)
    release_year = models.IntegerField()
    number_in_stock = models.IntegerField()
    daily_rate = models.FloatField()
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
    date_created = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

然而,vscode 强调

def __str__ (self):
Run Code Online (Sandbox Code Playgroud)

当我将鼠标悬停在它上面时,它告诉我:

str不返回 str pylint(E0307: 无效的 -str- 返回

我尝试寻找其他解决方案,但我找不到一个似乎符合我的情况的解决方案,所以如果这个问题已在其他地方解决,我深表歉意,而且我太无能,无法理解这个问题。

谢谢你的耐心!

sol*_*oke 5

这个问题有几个很好的说明,说明了为什么在过度依赖 IDE 和pylint. 我有两个建议:

  1. pylint错误只是一个警告,表明您的代码可能有问题 - 这不是绝对的事实。错误E0307

    __str__当方法返回的内容不是字符串时使用。

    pylint如果它说“当检查器无法确定您正在返回一个字符串时”,那就更准确了。在本例中,这是因为它无法识别 DjangoCharField实际上会返回有效的字符串实例。如果您运行代码,您现有的__str__方法将完美运行 - 无论您怎么pylint想。

    您可以通过强制返回值看起来像字符串来解决此问题,例如:

    return str(self.name)
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    return f"{self.name}"
    
    Run Code Online (Sandbox Code Playgroud)

    但在 pylint 中禁用对此行的检查同样有效,并了解它报告错误的原因。在不了解问题的情况下仅应用 Stack Overflow 上找到的修复程序将使您将来的代码难以调试。

  2. 您的代码中还有第二个完全不相关的问题,稍后会导致您出现问题,那就是这一行:

    from tkinter import CASCADE
    
    Run Code Online (Sandbox Code Playgroud)

    我非常有信心它已由您的 IDE 插入,而无需您显式添加它,因为您尝试CASCADE在您的ForeignKey. 这是 IDE 试图提供的帮助 - 不幸的是,它导入了一些完全无用的东西,这可能会在您尝试部署代码时给您带来问题。

这两者都强调了一个重要原则:不要依赖 IDE 或 linter。它们不能替代理解您自己的代码。