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