Как я могу переопределить __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. У меня есть два предложения:
Ошибка
pylintявляется лишь предупреждением, указывающим на то, что в вашем коде может возникнуть проблема - это не абсолютный факт. ОшибкаE0307говорит:Используется, когда метод
__str__возвращает что-то, что не является строкой.Было бы точнее, если бы здесь было сказано "когда проверяющий
pylintне может быть уверен, что вы возвращаете строку". В данном случае это происходит потому, что он не распознает, что DjangoCharFieldна самом деле возвращает действительный экземпляр строки. Ваш существующий метод__str__будет работать совершенно нормально, если вы запустите этот код - независимо от того, что думаетpylint.Вы можете обойти это, заставив возвращаемое значение выглядеть как строка, например, с помощью:
return str(self.name)or
return f"{self.name}"Но было бы не менее правильно отключить проверку этой строки в pylint, понимая почему он сообщает об ошибке. Простое применение исправления, найденного на Stack Overflow, без понимания проблемы затруднит отладку вашего кода в будущем.
В вашем коде есть вторая, совершенно несвязанная проблема, которая создаст вам проблемы позже, и это эта строка:
from tkinter import CASCADEЯ почти уверен, что она была вставлена вашей IDE, без вашего явного добавления, потому что вы пытались использовать
CASCADEв вашейForeignKey. Это IDE пытается быть полезной - к сожалению, она импортировала что-то совершенно бесполезное, что может вызвать проблемы при попытке развернуть ваш код.
Оба эти случая подчеркивают важный принцип: не полагайтесь на IDE или линтеры. Они не заменяют понимания собственного кода.