Как выполнить расчет между двумя полями в моделях Django в отношениях «многие ко многим» - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две модели на отношениях многие ко многим, и я пытаюсь вычесть одно поле в модели из другого поля в другой модели.У меня проблемы с выяснением, как это сделать.Я пытаюсь вычесть Leave_current_balance из модели LeaveBalance из Total_working_days для модели NewLeave.

Я добавил функцию, которая обрабатывает утверждение отпуска для директора.Есть два автора.Первый авторизатор - это менеджер, а второй - это директор.когда отпуск утверждается управляющим, он направляется директору для его утверждения.Я хочу настроить Leave_current_balance, как только он будет утвержден директором.Пока оба утверждения работают, но я хочу иметь возможность настроить Leave_current_balance после того, как разрешение было утверждено директором.

class LeaveBalance(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True,)
    Leave_current_balance= models.FloatField(null=True, blank=True, default=None)
    Year=models.CharField(max_length=100,default='')
    def __unicode__(self):
             return  self.Year


class NewLeave(models.Model):
      user=models.ForeignKey(User,default='',on_delete=models.CASCADE)
   leave_balance=models.ManyToManyField(Leave_Balance)
    Leave_type=models.CharField(max_length=100,blank=False,default='')
    Total_working_days=models.FloatField(null=True,  blank=False)
    def __unicode__(self):
        return  self.Leave_type




@login_required()
def unitDirectorForm(request,id):
    if request.method=='POST':
        getstaffid=NewLeave.objects.get(id=id)
        form=DirectorForm(request.POST,instance=getstaffid)

        if form.is_valid():
            form.save()

            return HttpResponse('You have successfully approved the leave')

    else:
        getstaffid=NewLeave.objects.get(id=id)
        form=DirectorForm(instance=getstaffid)
    return render(request,'managerauthorisedform.html',{'form':form})






@receiver(post_save, sender=NewLeave)
def update_leave_balance(sender, instance, **kwargs):
    if NewLeave.objects.filter(Director_Authorization_Status='Approved'):
        leave_balance_object = Leave_Balance.objects.get(user=instance.user_id)
        leave_balance_object = F('Leave_current_balance') - instance.Total_working_days
        leave_balance_object.save()

В сигнале я проверил утверждение директора перед выполнением расчета.Однако код генерирует сообщение об ошибке: объект «CombinedExpression» не имеет атрибута «save»

1 Ответ

0 голосов
/ 06 февраля 2019

Если я не ошибаюсь, всякий раз, когда у пользователя есть запись newLeave, вы хотите настроить Leave_current_balance модели LeaveBalance для newLeave Total_working_days.На мой взгляд, на самом деле нет необходимости иметь leave_balance в newLeave модели.Вы можете просто настроить их из newLeave модели singal (перейдите по этим ссылкам, если вы не знаете о django-signal link1 link2 ).

И из newLeave модели post_save мы можем настроить Leave_current_balance конкретного пользователя следующим образом.

from django.db.models import F
from .models import NewLeave, LeaveBalance
@receiver(post_save, sender=NewLeave)
def update_leave_balance(sender, instance, **kwargs):
    leave_balance_object = LeaveBalance.objects.get(user=instance.user_id)
    leave_balance_object = F('Leave_current_balance') - instance.Total_working_days
    leave_balance_object.save()
...