Количество джанго показывает другое значение после поиска

#python #django

#python #django

Вопрос:

Я имитирую приложение Instagram.

У меня есть последователи, модели действий.

Каждое действие выполняется для «последователя».

Многие действия могут указывать на одного подписчика.

 class Follower(models.Model):
    identifier = models.BigIntegerField(
        _("identifier"), unique=True, null=False, blank=False)

class ActionModel(models.Model):
    target = models.ForeignKey(Follower, verbose_name=_("Target"), 
    on_delete=models.CASCADE)  # username of the done-on action
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        null=True,
    )  # django user that performed the action
    is_followed_back = models.BooleanField(_("Followed Back"), null=True, 
        blank=True) # is target followed back
 

Панель администратора:

 # Custom Admin for Follower model
class FollowerAdmin(AdminAdvancedFiltersMixin, NumericFilterModelAdmin, SpecialActions):
...
    # Private method to count been_followed_counter
    def _get_been_followed_count(self, obj):
        return obj.been_followed_count
    _get_been_followed_count.short_description = 'Been Followed Count'
    _get_been_followed_count.admin_order_field = 'been_followed_count'

    # Private method to count follow_back_count
    def _get_follow_back_count(self, obj):
        return obj.follow_back_count
    _get_follow_back_count.short_description = 'Follow Back Count'
    _get_follow_back_count.admin_order_field = 'follow_back_count'
 

Затем я переопределяю get_queryset для подписчиков:

     # Override queryset method to add count's
    def get_queryset(self, request):

        qs = super().get_queryset(request)

        qs = qs.annotate(
            been_followed_count=Count('actionmodel', filter=Q(actionmodel__user=request.user))
        ).annotate(
            follow_back_count=Count(
                'actionmodel',
                filter=Q(actionmodel__user=request.user) amp; Q(actionmodel__is_followed_back=True)
            )
        )
 

Я получаю действительно странные результаты в панели администратора:
нет поиска в панели

ИМЯ ПОЛЬЗОВАТЕЛЯ: lior___shahar

КОЛИЧЕСТВО ВЫПОЛНЕННЫХ ДЕЙСТВИЙ: 5

ПОСЛЕДУЮЩИЙ ОБРАТНЫЙ ОТСЧЕТ: 5

Это истинное ЗНАЧЕНИЕ в действиях: значение в действии

Но как только я выполняю ПОИСК в FOLLOWERS для имени пользователя: после поиска

ИМЯ ПОЛЬЗОВАТЕЛЯ: lior___shahar

КОЛИЧЕСТВО ВЫПОЛНЕННЫХ ДЕЙСТВИЙ: 320

ПОСЛЕДУЮЩИЙ ОБРАТНЫЙ ОТСЧЕТ: 320

Я не понимаю, что не так.

Ответ №1:

Попробуйте добавить distinct=True к аннотации count.

 been_followed_count=Count('actionmodel', filter=Q(actionmodel__user=request.user), distinct=True)