Как передать 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.
В конечном итоге я пытаюсь создать отчет о заработной плате / табеле учета рабочего времени.