gpt4 book ai didi

python - 如何从另一个模型操纵一个模型字段的值?

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:07 26 4
gpt4 key购买 nike

我有两个模型

class Employee(models.Model):
name = models.CharField(max_length=20)
ID = models.IntegerField()
basic_salary = models.IntegerField()
total_leave = models.IntegerField(default = 14)
paid_leave = models.IntegerField(default = 0)
unpaid_leave = models.IntegerField(default = 0)

def __str__(self):
return self.name

class Leave_management(models.Model):

name = models.OnetoOneField(Employee,on_delete= models.CASCADE)
reason = models.CharField(max_length=50)
from = models.DateTimeField()
to = models.DateTimeField()
total_days = models.IntegerField()

def __str__(self):
return self.name

所以,我想从“model-Employee”的“total_leave”字段中减去“model-Leave_management”的“total_days”。根据休假情况,我想更新“带薪休假”和“无薪休假”部分。

如果这两个模型是一个模型,我可以这样做(下面的示例),但我不知道如何在不同的模型中执行。

def save(self,*args,**kwargs):
if self.total_days<=self.total_leave:
self.total_leave -= self.total_days
self.unpaid_leave = 14 - self.total_leave
else:
self.total_days -= 14
self.paid_leaves = self.total_days
super(Model_name,self).save(*args,**kwargs)

` 请指导我。

最佳答案

事实上,您的 OneToOneField(..)Employee 而言,不是 姓名。在数据库级别,它将存储与 Employeeprimary keys 对应的值,而在 Django 中,name 将是一个 lazy 获取相应的 Employee。因此,我建议将您的函数重命名为(例如)employee

另一个问题是您将其定义为 OneToOneField。这意味着 Employee一个 Leave_management。但是根据字段(reasonfromto 等),看起来 Employee 可以有零个、一个或多个 Leave_management。所以这意味着它是一个 ForeignKey

所以我们的模型看起来像:

class Leave_management(models.Model):

<b>employee</b> = models.<b>ForeignKey</b>(Employee,on_delete= models.CASCADE)
reason = models.CharField(max_length=50)
from = models.DateTimeField()
to = models.DateTimeField()
total_days = models.IntegerField()

def __str__(self):
return self<b>.employee</b>.name

就像 __str__ 函数已经暗示的那样,我们可以通过查询 self.employee 来获取员工的姓名,然后我们可以获取它的 .name 属性。

但现在的挑战是在保存 Leave_management 对象时要做什么。在这种情况下,应该更新 total_leavepaid_leave 的数量。

我们首先必须计算出与 Employee 相关的 Leave_management 对象中存储的 total_days 总数,这等于:

(Leave_management.objects.filter(employee=some_employee)
.aggregate(<b>totals=Sum('total_days')</b>)['totals'] or 0

因此我们可以从 14 中减去它,并将(可能)剩余的天数存储在 paid_leave 中,例如:

class Leave_management(models.Model):

# ...

def save(self, *args, **kwargs):
super(Leave_management, self).save(*args, **kwargs)
totals = (Leave_management.objects
.filter(employee=some_employee)
.aggregate(totals=Sum('total_days'))['totals'] or 0
employee = self.employee
unpaid = min(14, totals)
employee.total_leave = 14 - unpaid
employee.unpaid_leave = unpaid
employee.paid_leave = totals - unpaid
employee.save()

Note: typically we do not handle this by overriding the .save(..) function, but by using Django signals: triggers that can be implemented when certain objects are saved, etc. This especially should be used since the objects can be changed circumventing the .save(..) function, and sometimes such objects might get deleted as well. So the above is not a good design decision.

Even when we use signals, it is a good idea to frequently (for example once a day) recalculate the total leave, and update the corresponding Employee models.

关于python - 如何从另一个模型操纵一个模型字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50845469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com