В Django, получить несколько графов различных условий - PullRequest
0 голосов
/ 26 сентября 2019

Я занимаюсь разработкой "Admin DashBoard" с Django 2.2

Я бы посчитал "Объекты" различных условий из одной таблицы и отправил бы их в шаблон.

Мой код приведен ниже..

# model
class User(models.Model):
    uid = models.AutoField(primary_key=True)
    status = models.IntegerField(blank=True, null=True)
    created_at = models.DateTimeField(blank=True, null=True)
    created_at_unix = models.CharField(max_length=100, blank=True, null=True)
    country_code = models.IntegerField(blank=True, null=True)
    recommender_id = models.ForeignKey('self', on_delete=models.SET_NULL ,blank=True, null=True, db_column='recommender_id')
    is_agreement = models.PositiveIntegerField(blank=True, null=True)
    delete_yn = models.CharField(max_length=1, default='n')
    is_sms = models.PositiveIntegerField(blank=True, null=True)
    is_email = models.PositiveIntegerField(blank=True, null=True)
    is_push = models.PositiveIntegerField(blank=True, null=True)



def index(request):
    # New User
    user_lastweek = User.objects.filter(created_at__gte=last_monday, created_at__lte=last_sunday).count()
    user_thisweek = User.objects.filter(created_at__gte=this_monday, created_at__lte=tomorrow).count()
    user_variation = user_thisweek - user_lastweek
    # User total
    user_total_lastweek = User.objects.filter(created_at__lte=last_sunday).count()
    user_total_thisweek = User.objects.filter(created_at__lte=tomorrow).count()
    user_total_variation = user_total_thisweek - user_total_lastweek

    context = {
    'user_lastweek':user_lastweek,
    ...

    }
    return render(request, 'main/index.html', context)

Я написал только несколько из множества условий.

Но мой код вызывает дублирование запросов каждый раз.

Результат, который мне нужен, похож на..

1. user_lastweek : 114
2. user_thisweek : 98
3. user_total_lastweek : 1232
4. user_total_thisweek : 1330

Как эффективно отобразить шаблон только с одним запросом или с меньшим количеством запросов?

1 Ответ

0 голосов
/ 26 сентября 2019

решил это сам ..

Я должен был прочитать больше о документации Django.

Использовать .aggregate ()

test = User.objects.aggregate(
        last = Count('pk', filter=Q(created_at__lte=last_sunday)),
        this = Count('pk', filter=Q(created_at__lte=tomorrow)),
        last1 = Count('pk', filter=Q(created_at__gte=last_monday, created_at__lte=last_sunday)),
        this1=Count('pk', filter=Q(created_at__gte=this_monday, created_at__lte=tomorrow)),
    )
    print(test)
{'last': 1011, 'this': 1018, 'last1': 38, 'this1': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...