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)
я хочу подсчитать сколько "commit" у пользователя, удалить пользователя если у него нет "commit" и "commit" меньше 7 дней, отсортировать по верхнему, и удалить мой аккаунт по этому фильтру, как это сделать? thx
вы можете это сделать
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]