Как передать kwargs из представления в models.querset, а затем в as_manager()?

Я пытаюсь фильтровать по приложениям Django (одна и та же база данных). У меня есть события, на которые были назначены сотрудники, различные роли, которые сотрудники выполняют в разное время (обычно одна роль на событие), каждая роль с различными ставками оплаты. Вот модели, о которых идет речь:

class Event(models.Model):
    event_type = ForeignKey(EventType, on_delete=models.DO_NOTHING, default=1)
    event_name = models.CharField(max_length=200)
    event_date = models.DateField(default=datetime.now)
    event_time = models.TimeField(default='07:00 pm')
    event_length_in_hours = models.DecimalField(max_digits=4, decimal_places=2, default=2.0)
    is_this_tax_exempt = models.BooleanField(null=False, default=False)
    painting_with_a_purpose = models.BooleanField(null=False, default=False)
    paint_pour_event = models.BooleanField(null=False, default=False)
    prepaint_product_used = ForeignKey(Product, on_delete=models.DO_NOTHING, related_name='prepaint_product_used', default=1, limit_choices_to={'product_active': True, 'product_type': '1'})
    prepaint_product_qty = models.IntegerField(default=0)
    stage_product_used = ForeignKey(Product, on_delete=models.DO_NOTHING, related_name='stage_product_used', default=2, limit_choices_to={'product_active': True, 'product_type': '1'})
    stage_product_qty = models.IntegerField(default=1)
    credit_card_tip_received = models.BooleanField(null=False, default=False)
    credit_card_tip_amount = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
    credit_card_tip_percent_shared_from_stage = models.DecimalField(max_digits=3, decimal_places=2, default=0.30)
    event_ad_fees = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
    event_discounts = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
    event_extra_expense = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
    event_extra_income = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)


class EventWorker(models.Model):
    staff_member = models.ForeignKey(Staff, on_delete=models.DO_NOTHING, limit_choices_to={'is_active_staff': True})
    role_worked = models.ForeignKey(EventRole, default=1, on_delete=models.DO_NOTHING)
    event_id = models.ForeignKey(Event, on_delete=models.CASCADE)
    hours_worked = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)


class EventRole(models.Model):
    role_name = models.CharField(max_length=100)

    def __str__(self):
        return self.role_name


Затем в другом приложении внутри того же Django deployment у меня есть следующее:


class Staff(models.Model):
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, default=1, related_name='member')
    full_name = models.CharField(max_length=200)
    phone = models.CharField(max_length=200)
    start_date = models.DateField('date of employment')
    end_date = models.DateField('date of termination')
    is_active_staff = models.BooleanField(null=False, default=True)

    class Meta:
        ordering = ['full_name']

    def __str__(self):
        return self.full_name


class Pay(models.Model):
    staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
    pay_stage = models.DecimalField(max_digits=5, decimal_places=2)
    pay_floor = models.DecimalField(max_digits=5, decimal_places=2)
    pay_office = models.DecimalField(max_digits=5, decimal_places=2)
    start_date = models.DateField('date of pay starting')
    end_date = models.DateField('date of pay ending')

    def __str__(self) -> str:
        return super().__str__()

    objects = get_pay_rate.as_manager()


class get_pay_rate(models.QuerySet):
    def current_pay(self, *args, **kwargs):
        # pr_start = self.kwargs.get('pr_start'). ## these are what I was trying
        # pr_end = self.kwargs.get('pr_end')
        pr_start = '2021-10-1'. ## I used these to test if the query below works (and it does)
        pr_end = '2021-10-3'
        pr_staff = '3'
        return Pay.objects.filter(start_date__lte=pr_start, end_date__gte=pr_end, staff=pr_staff)

Вот вид, с которым я играл (используя различные идеи, найденные из различных результатов Google) :)

class PayrollListView (PermissionRequiredMixin, ListView):
    # raise_exception = True  # Raise exception when no access instead of redirect
    permission_denied_message = "You are not allowed here."
    permission_required = 'staff.view_staff'
    context_object_name = 'payroll'
    template_name = 'staff/payroll_list.html'

    # def get_queryset(self):
    #     pr_start_date = "2021-10-1"
    #     pr_end_date = "2021-10-31"
    #     # qs = Pay.objects.filter(staff__in=EventWorker.objects.filter(event_id__in=Event.objects.filter(event_date__range=(pr_start_date, pr_end_date))))
    #     # return qs
    def get_queryset(self, **kwargs):
        pr_start = self.kwargs.get('date')
        pr_end = pr_start + datetime.timedelta(days=14)

        myset = Pay.objects.current_pay().filter()
        # myset = Pay.objects.current_pay().values_list('staff', 'pay_stage', 'pay_floor', 'pay_office')
        print(pr_start)
        print(pr_end)
        print(myset.query)
        print(myset)
        return myset

и urls.py

from django.urls import path, register_converter
from datetime import datetime
from staff.views import StaffListView
from . import views

class DateConverter:
    regex = '\d{4}-\d{2}-\d{2}'

    def to_python(self, value):
        return datetime.strptime(value, '%Y-%m-%d')

    def to_url(self, value):
        return value

register_converter(DateConverter, 'yyyy')

urlpatterns = [
    #path('', views.index, name='index'),
    path('', StaffListView.as_view(),
        name="staff_list"),
    path('pr/', views.PayrollListView.as_view(),
        name="payroll_list"),
    path('pr/start/<yyyy:date>/', views.PayrollListView.as_view(), name='date'),
]

Я не уверен, что мой подход к модели неправильный, или я упускаю что-то простое (или не очень простое). Это мой первый проект Django.

В конечном итоге я пытаюсь создать отчет о заработной плате / табеле учета рабочего времени.

Вернуться на верх