Наследование моделей и менеджеров в 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?

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