Django — Подсчет и фильтрация в наборе запросов

#django

Вопрос:

я хочу создать сложный набор запросов , спустя много времени без успеха 🙁 я прошу вашей помощи,

это мои модели:

 class Commit(odels.Model):
    date = models.DateTimeField(auto_now_add=True)
    created = models.BooleanField(default=False)
    creator = models.ForeignKey(
       get_user_model(),
       on_delete=models.SET_NULL,
       null=True,
       blank=True,
       related_name="%(class)s_creator"
    )
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    uuid = models.CharField(max_length=200)
    updated_fields = models.TextField(null=True, blank=True)
 

я хочу посчитать, сколько у пользователя «фиксации», удалить пользователя , если у пользователя нет «фиксации» и фиксация меньше 7 дней, отсортировать по верхнему значению и удалить мою учетную запись в этом фильтре , как это сделать ? thx

Ответ №1:

вы можете сделать это

 week = timezone.now() - timezone.timedelta(days=7)
my_username = "my_username"

lst_week = User.objects
            .annotate(count=Count('commit_creator', filter=Q(commit_creator__date__gte=week)))
            .filter(~Q(username=my_username), count__gte=1)
            .order_by('-count')
            .prefetch_related('commit_creator')
            .values('count', 'username')[:3]
 
 

объясненный :

 # here you set time now less seven days
week = timezone.now() - timezone.timedelta(days=7)

# change with your username 
my_username = "my_username"

lst_week = User.objects
            # you count commit by creator and you count only when date is upper thans seven days
            .annotate(count=Count('commit_creator', filter=Q(commit_creator__date__gte=week)))
            # you remove your username and remove all user have not "commit"
            .filter(~Q(username=my_username), count__gte=1)
            # order reverse by count
            .order_by('-count')
            # optimzie for sql union
            .prefetch_related('commit_creator')
            # and get only count and username value and only 3
            .values('count', 'username')[:3]