Model Manager; TypeError: isinstance() arg 2 должен быть типом или кортежем типов

Я пытаюсь протестировать метод в пользовательском менеджере моделей by_week(). Отлаживая его, я столкнулся с проблемой попытки запросить все объекты внутри метода с помощью profile.questions.all() и self.model.objects.all(), где self.model является моделью Question. Однако в обоих случаях возникает следующая ошибка: *** TypeError: isinstance() arg 2 must be a type or tuple of types. Почему возникает эта ошибка?

В качестве справочной информации: Я создал тестовые данные, создав экземпляры через интерфейс администратора и сбросив все, что было в базе данных, в JSON-файл.

models.py

class QuestionSearchManager(Manager):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def by_week(self, profile):
        # today = datetime.date.today()
        # weekago = today - datetime.timedelta(days=7)
        questions = self.model.objects.all()
        user_tags = profile.questions.all()
        x = self.model.objects.filter(
            tags__name__in=user_tags
        )
        return x


class Post(Model):

    body = TextField()
    date = DateField(default=datetime.date.today)
    comment = ForeignKey('Comment', on_delete=CASCADE, null=True)
    profile = ForeignKey(
        'authors.Profile', on_delete=SET_NULL, null=True,
        related_name='%(class)ss',
        related_query_name="%(class)s"
    )
    score = GenericRelation(
        'Vote', related_query_name="%(class)s"
    )


    class Meta:
        abstract = True


class Question(Post):

    title = CharField(max_length=75)
    tags = ManyToManyField(
        'Tag', related_name="questions", related_query_name="question"
    )
    objects = Manager()
    postings = QuestionSearchManager()

python manage.py shell

>>> from authors.models import Profile
>>> p = Profile.objects.get(id=2)
>>> p.questions.all()
<QuerySet [<Question: Question object (13)>]>
>>> from posts.models import Question
>>> Question.objects.all()
<QuerySet [<Question: Question object (9)>, <Question: Question object (10)>, <Question: Question object (11)>, <Question: Question object (12)>, <Question: Question object (13)>, <Question: Question object (14)>]>

В приведенном вами примере объект questions никогда не используется. Но в качестве примечания, вместо self.model.objects.all() вы, вероятно, захотите использовать self.get_queryset() для запроса модели, которой управляет менеджер, а затем использовать ее для фильтрации вопросов.

Что-то вроде

    questions = self.get_queryset()
    user_tags = profile.questions.all()
    x = questions.filter(
        tags__name__in=user_tags
    )

Ошибка, которую вы видите, сбивает с толку, поскольку происходит то, что вы вызываете пользовательский __getattr__, который, в свою очередь, использует isinstance с неверными аргументами. Тип элементов, передаваемых в tags__name__in=, должен совпадать с типом поля tags__name. Предположительно, это строки, а не экземпляры Question.

Итак, исправление заключается в том, чтобы исправить значение user_tags так, чтобы оно соответствовало типу, ожидаемому для tags__name.

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