Дубликат экземпляра, возвращенного в 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

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