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
.