Дубликат экземпляра, возвращенного в QuerySet
Я пытаюсь создать метод, который фильтрует вопросы на основе тегов, которые встречаются только в вопросах конкретного пользователя. Есть проблема с QuerySet, где он возвращает Queryset([Question13, Question 14, Question13]). Однако, когда добавляется .distinct(), он возвращает желаемый результат QuerySet([Question13, Question 14]).
Почему второй цепочечный метод .filter() добавляет дубликат экземпляра в QuerySet?
class Post(Model):
body = TextField()
date = DateField(default=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()
class QuestionSearchManager(Manager):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def by_week(self, profile):
today = date.today()
weekago = today - timedelta(days=7)
queryset = self.get_queryset().filter(
date__range=(weekago, today)
).filter(tags__name__in=profile.questions.values_list(
"tags__name", flat=True
))
return queryset
postings.json
{
"model": "posts.question",
"pk": 13,
"fields": {
"body": "Content of Question 005",
"date": "2022-02-12",
"comment": null,
"profile": 2,
"title": "Question__005",
"tags": [
1,
7
]
}
},
{
"model": "posts.question",
"pk": 14,
"fields": {
"body": "Content of Question 006",
"date": "2022-02-12",
"comment": null,
"profile": 3,
"title": "Question__006",
"tags": [
1,
2
]
}
}
Это также озадачило меня на некоторое время, но это связано с tags если фильтр ссылается на несколько тегов и свойство этих тегов name вы теперь будете возвращать строку на каждую tag ссылку
distinct - ваш лучший друг при фильтрации с помощью этого запроса в стиле tags__name.
Несомненно, поскольку это отношения "многие ко многим", это будет общей вещью, о которой вам нужно знать при фильтрации этих отношений.
Это похоже на этот вопрос: Логика или Django многие ко многим запросам возвращает дублирующиеся результаты
Вы также можете прочитать этот раздел документации Django, чтобы лучше понять, как работают их запросы: https://docs.djangoproject.com/en/4.0/topics/db/queries/#spanning-multi-valued-relationships