Как получить общее количество созданных PV для всех пользователей Django - PullRequest
0 голосов
/ 29 января 2020

У меня есть простые модели:

class Pv(models.Model):
accounts =(
    ('Sub CF','Sub CF'),
    ('Special','Special'),
    ('Directors','Directors'),
    ('Operations','Operations'),
    ('LSGDP','LSGDP'),
    ('DWAP','DWAP'),
    ('Capacity(USD)','Capacity(USD)')
    )
acc =(
('Yes','Yes'),
('No', 'No')
)

source =(
        ('GOG','GOG'),
        ('Others', 'Others')
      )
pv =(
    ('General','General'),
    ('Honorarium','Honorarium')
   )
center=(
    ('Cost Center 1','Cost Center 1'),
    ('Cost Center 2','Cost Center 2'),
    ('Cost Center 3','Cost Center 3'),
    ('Cost Center 4','Cost Center 4'),
    ('Cost Center 5','Cost Center 5')
       )
stat =(
    ('Completed','Completed'),
    ('Returned','Returned'),
    ('Cancelled','Cancelled')
)
IA_System_Code = models.AutoField(primary_key = True)
IA_code = models.CharField(max_length = 150)
Date_recieved = models.DateField()
Pv_reference = models.CharField(unique = True, max_length = 120)
Source_of_Funding = models.CharField(max_length=50, choices = source)
Cost_center = models.CharField(max_length=50, choices = center)
Payee = models.CharField(max_length=500)
Description = models.CharField(max_length = 500)
Account_code = models.CharField(max_length=350)
Gross_amount = models.DecimalField(max_digits=19, decimal_places=2)
Withholding_tax = models.DecimalField(max_digits=19, decimal_places=2)
Net_amount = models.DecimalField(max_digits=19, decimal_places=2)
Status = models.CharField(max_length = 60, choices = stat )
Remarks =models.CharField(max_length = 500, blank = True)
Acc_Impress = models.CharField(max_length = 350,choices=acc)
Date_returned =models.DateField(null=True,blank = True)
Type_of_accounts= models.CharField(max_length = 100, choices = accounts)
Type_of_pv = models.CharField(max_length = 20, choices = pv)
returned_to_chest = models.DecimalField(max_digits=19, decimal_places=2)
created = models.DateTimeField(null=True)
created_by = models.ForeignKey('auth.User', blank=True, null=True,\ 
                               default=None,on_delete=models.CASCADE,related_name='create')
modified = models.DateTimeField(null=True)
modified_by = models.ForeignKey('auth.User', blank=True, null=True,\
                                 default=None ,on_delete=models.CASCADE,related_name='modified')
class Meta():
        ordering = ["IA_System_Code"]



def __str__(self):
    return self.Description

def save(self, *args, **kwargs):
    user = get_current_user()
    if user and not user.pk:
        user = None
    if not self.pk:
        self.created_by = user
        self.created = datetime.now()
    else:
        self.modified_by = user
        self.modified = datetime.now()
    super(Pv, self).save(*args, **kwargs) 

Я изо всех сил пытаюсь выяснить, что я считаю простым запросом, с помощью Django ORM.

Давайте скажем, у меня есть 6 PV, созданных 3 уникальными пользователями Теперь, что я действительно хочу, это запросить все pv и посчитать pvs, созданные каждым пользователем, но хочу только одного из каждого уникального пользователя и добавить (что, я думаю, должно быть аннотированное) свойство называется общее для каждого пользователя. Я также не хочу отображать пользователей в системе, которые не сделали ни одной записи PV.

Так что, если у пользователя есть 2 созданных PV, его общая сумма будет 2. Пожалуйста, кто-нибудь может мне помочь. Как мне отобразить его на моем шаблоне в виде таблицы. пример:

   user   total pv recorded for the yr
   John       10
   peter      20
   pack        5

пожалуйста, кто-нибудь может мне помочь. Похоже, я не знаю, что я делаю. спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2020

@ sandeep Ваш запрос ничего не отображал в шаблоне, поэтому я сначала запросил всех пользователей

VIew.py

 from django.db.models import Count, Q 
 import datetime
  qry = User.objects.all()

Затем я отфильтровал запрос с вашим кодом

qryr = qry.filter(Q(create__isnull=False)\ &
                       Q(create__created__year=today.year))\
                       .annotate(counter=Count('create'))\
                       .prefetch_related('create').order_by('-counter')

и вот мой шаблон

шаблон. html

<table class="table table-bordered table-hover">
             <thead>
               <tr>
                 <th scope="col">Users</th>
                 <th scope="col">Pv's Recorded</th>


               </tr>
             </thead>
             <tbody>
                {% for i in qryr %}

               <tr>
                   <td>{{i.first_name}} {{i.last_name}}</td>
                   <td> {{ i.counter }}</td>
               </tr>
               {% endfor %}
             </tbody>
           </table>

большое спасибо

0 голосов
/ 29 января 2020

Вы можете написать этот запрос. views.py

 from django.db.models import Count, Q # import Q here
 import datetime
 today = datetime.datetime.now()
 qry = User.objects.filter(Q(create__isnull=False) & Q(create__created__year=today.year)).\
       annotate(counter=Count('create')).\
       prefetch_related('create') # this will only count the PV s from current yaer

отправить qry в шаблон

template

{% for i in qry %}
{% if i.counter != 0 %} # checking if PV exist for user
# edited line
<p>{{ i.first_name }} {{ i.counter }}</p> # first name number of PVs

{% endif %}
{% endfor %}

Надеюсь, это поможет .

Редактировать

Вы можете распечатать все, что захотите. {{j.description}}, например. Я отредактировал код. Текущий код напечатает fisrt_name и countte (Джон 5). Вы можете заменить first_name на любое, например, first_name last_name count , или вы определили name в модели. Отредактировано Я отредактировал ваш запрос, так что теперь он учитывает только тех пользователей, которые зарегистрировали только pv. теперь мне нужно сбросить счетчик на ноль, когда начнется новый год

...