#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)