Наследование моделей и менеджеров в django
У меня флаг моделирует то, что происходит от Flag объекта и помогает мне классифицировать типы.
class Flag(models.Model):
title = models.CharField(max_length=20)
content = models.CharField(max_length=200)
user = models.ForeignKey(User, on_delete=models.CASCADE)
createTime = models.DateTimeField(default=now, editable=0)
class ArticleFlag(Flag):
article = models.ForeignKey('articles.Article', on_delete=models.CASCADE)
class CommentFlag(Flag):
comment = models.ForeignKey('comments.Comment', on_delete=models.CASCADE)
class QuestionFlag(Flag):
question = models.ForeignKey('questions.Question', on_delete=models.CASCADE)
class AnswerFlag(Flag):
answer = models.ForeignKey('questions.Answer', on_delete=models.CASCADE)
Затем я пытаюсь определить метод на любом из дочерних классов:
class ArticleFlag(Flag):
article = models.ForeignKey('articles.Article', on_delete=models.CASCADE)
def test(self):
return self.article.title
затем я проверил его хранение базы данных следующим образом:
from flags.models import *
flags = Flag.objects.all()
articleflags = ArticleFlag.objects.all()
for flag in articleflags:
print(flag.pk)
# 1, 3
for flag in flags:
print(flag.pk)
# 1, 2, 3, 4, 5, 6, 7
и понял, что объекты дочернего класса всегда являются подмножеством объектов родительского класса, тогда я проверяю его метод по
from flags.models import *
flags = Flag.objects.all()
articleflags = ArticleFlag.objects.all()
for flag in flags:
try:
print(flag.test())
except:
pass
однако я ничего не получил, даже если в базе данных хранятся экземпляры флагов статей, кажется, что метод всегда неопределен; тогда я попробовал следующее:
from flags.models import *
flags = Flag.objects.all()
articleflags = ArticleFlag.objects.all()
for flag in articleflags:
try:
print(flag.test())
except:
pass
на этот раз все сработало как ожидалось, что метод вызван.
существует ли способ преобразования экземпляров дочерних классов, таких как
ArticleFlag,CommentFlag, в экземпляры родительского классаFlag?
Я имею в виду, преобразовать
[Flag, Flag, Flag]в[ArticleFlag, CommentFlag, DemoFlag]? Чтобы я мог определить и вызвать метод на них и играть с MRO?