- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有两个模型
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
而言,不是 姓名
。在数据库级别,它将存储与 Employee
的 primary keys 对应的值,而在 Django 中,name
将是一个 lazy 获取相应的 Employee
。因此,我建议将您的函数重命名为(例如)employee
。
另一个问题是您将其定义为 OneToOneField
。这意味着 Employee
有 一个 Leave_management
。但是根据字段(reason
、from
、to
等),看起来 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_leave
和 paid_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/
我是一名优秀的程序员,十分优秀!