Как я могу переопределить __str__ в models.py?

Прошу прощения, если это глупый вопрос, я совсем новичок в python и django.

Я изучаю учебник по django, и мы создаем фальшивый киносайт, на котором фильмы перечисляются по жанрам, названиям и т. д.

В настоящее время я пытаюсь переопределить функцию __str__ в файле models.py, чтобы вместо отображения жанра (1) она отображала фактический жанр (например, "Action").

Вот как выглядит мой 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 говорит:

    Используется, когда метод __str__ возвращает что-то, что не является строкой.

    Было бы точнее, если бы здесь было сказано "когда проверяющий pylint не может быть уверен, что вы возвращаете строку". В данном случае это происходит потому, что он не распознает, что Django CharField на самом деле возвращает действительный экземпляр строки. Ваш существующий метод __str__ будет работать совершенно нормально, если вы запустите этот код - независимо от того, что думает pylint.

    Вы можете обойти это, заставив возвращаемое значение выглядеть как строка, например, с помощью:

    return str(self.name)
    

    or

    return f"{self.name}"
    

    Но было бы не менее правильно отключить проверку этой строки в pylint, понимая почему он сообщает об ошибке. Простое применение исправления, найденного на Stack Overflow, без понимания проблемы затруднит отладку вашего кода в будущем.

  2. В вашем коде есть вторая, совершенно несвязанная проблема, которая создаст вам проблемы позже, и это эта строка:

    from tkinter import CASCADE
    

    Я почти уверен, что она была вставлена вашей IDE, без вашего явного добавления, потому что вы пытались использовать CASCADE в вашей ForeignKey. Это IDE пытается быть полезной - к сожалению, она импортировала что-то совершенно бесполезное, что может вызвать проблемы при попытке развернуть ваш код.

Оба эти случая подчеркивают важный принцип: не полагайтесь на IDE или линтеры. Они не заменяют понимания собственного кода.

Вернуться на верх