如何覆盖 models.py 中的 __str__?

How can I override __str__ in models.py?

抱歉,如果这是一个愚蠢的问题,我是 python 和 django 的新手。

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

我目前正在尝试覆盖 models.py 文件中的 __str__ 函数,因此它不显示流派 (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)

但是,vscode 强调了

def __str__ (self):

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

str does not return str pylint(E0307: invalid -str- returned

我试过其他解决方案,但找不到符合我的情况的解决方案,所以如果其他地方已经解决了这个问题,我深表歉意,我太无能无法理解这个问题。

感谢您的耐心等待!

这个问题很好地说明了为什么在过度依赖 IDE 和 pylint 等工具之前理解代码很重要。我有两个建议:

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

    Used when a __str__ method returns something which is not a string.

    如果它说“当 pylint 检查器不能确定您正在 return 字符串时”会更准确。在这种情况下,这是因为它无法识别 Django CharField 实际上 return 是一个有效的字符串实例。如果您 运行 代码,您现有的 __str__ 方法将工作得很好——不管 pylint 怎么想。

    您可以通过强制 return 值看起来像一个字符串来解决这个问题,例如:

    return str(self.name)
    

    return f"{self.name}"
    

    但是对于 pylint 中的这一行,disable the check 同样有效,理解 报告错误的原因。只是在不了解问题的情况下应用在 Stack Overflow 上找到的修复程序将使将来很难调试您的代码。

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

    from tkinter import CASCADE
    

    我非常确信这是由您的 IDE 插入的,您没有明确添加它,因为您试图在 ForeignKey 中使用 CASCADE。这是 IDE 试图提供帮助的东西 - 不幸的是,它导入了一些完全无用的东西,当您尝试部署代码时,它可以

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