在 Django 中将数据插入 table 之前检查条件
Checking condition before inserting data to a table in Django
我有 5 tables User
(即员工),Positions
和 Emp_position
(这是员工和职位之间的关系 table ).我有一个部门 table,其中包含我公司所有部门的列表和一个关系 table Works_in
,它将 User
(Employee) 映射到一个部门。现在在 Works_in table 中,当我将 User
(Employee) 映射到 Department
时,我想检查我插入的数据是否 Works_in(关系)table。那就是将员工映射到部门是否已经映射了经理。
示例:
员工
Himanshu
Bassi
BB
位置
Developer
Manager
Tester
Emp_position(关系table)
Employee Position
Himanshu Developer
Bassi Manager
BB Manager
部门
Web UI
Data Analysis
Machine Learning
Works_in(关系table)
Employee Department
Himanshu Web UI
Bassi Web UI
BB Web UI # this is wrong, which needs to be checked
每个员工都会映射到一个部门,但是一个部门不应该有多个经理。在这里,因为 Bassi 和 BB 是经理,我们不希望他们被映射到同一个部门。因此,为此我想在数据 BB Web UI
被插入到我们的 Works_in table 之前检查要映射到部门的部门是否已经有经理映射到它.所以我想在将数据插入我的 Works_in table 之前进行检查。
这是我的 models.py 文件。
from django.contrib.auth.models import User
class Position(models.Model):
position_name = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.position_name
class Emp_position(models.Model):
emp_uname = models.ForeignKey(User, related_name='emp_name', to_field='username', on_delete=models.CASCADE, unique=True)
position_name = models.ForeignKey(Position, related_name='position', to_field='position_name', on_delete=models.CASCADE)
def __str__(self):
return str(self.emp_uname) + " " + str(self.position_name)
class Department(models.Model):
name = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.name
class Works_in(models.Model):
emp_name = models.ForeignKey(User, related_name='works_emp_name', to_field='username', on_delete=models.CASCADE)
dept_name = models.ForeignKey(Department, blank=False, null=False, to_field='name',related_name='works_on_dept', on_delete=models.CASCADE)
def __str__(self):
return str(self.emp_name) + " " + str(self.dept_name)
根据文档here,您可以像这样使用接收器装饰器连接到信号,
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Works_in
@receiver(pre_save, sender=Works_in)
def my_handler(sender, **kwargs):
# Your pre_save logic here
if i_dont_want_to_save:
raise Exception('Dont save me!')
希望对您有所帮助!
在搜索并做了一些与问题中提到的我的需求相关的研究之后。我们可以为此覆盖模型内部的 clean 方法,并在 clean 方法内部引发错误,以防输入的数据不满足我们的逻辑
def clean(self):
# statements
if condition:
raise ValidationError('Error message')
我有 5 tables User
(即员工),Positions
和 Emp_position
(这是员工和职位之间的关系 table ).我有一个部门 table,其中包含我公司所有部门的列表和一个关系 table Works_in
,它将 User
(Employee) 映射到一个部门。现在在 Works_in table 中,当我将 User
(Employee) 映射到 Department
时,我想检查我插入的数据是否 Works_in(关系)table。那就是将员工映射到部门是否已经映射了经理。
示例:
员工
Himanshu
Bassi
BB
位置
Developer
Manager
Tester
Emp_position(关系table)
Employee Position
Himanshu Developer
Bassi Manager
BB Manager
部门
Web UI
Data Analysis
Machine Learning
Works_in(关系table)
Employee Department
Himanshu Web UI
Bassi Web UI
BB Web UI # this is wrong, which needs to be checked
每个员工都会映射到一个部门,但是一个部门不应该有多个经理。在这里,因为 Bassi 和 BB 是经理,我们不希望他们被映射到同一个部门。因此,为此我想在数据 BB Web UI
被插入到我们的 Works_in table 之前检查要映射到部门的部门是否已经有经理映射到它.所以我想在将数据插入我的 Works_in table 之前进行检查。
这是我的 models.py 文件。
from django.contrib.auth.models import User
class Position(models.Model):
position_name = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.position_name
class Emp_position(models.Model):
emp_uname = models.ForeignKey(User, related_name='emp_name', to_field='username', on_delete=models.CASCADE, unique=True)
position_name = models.ForeignKey(Position, related_name='position', to_field='position_name', on_delete=models.CASCADE)
def __str__(self):
return str(self.emp_uname) + " " + str(self.position_name)
class Department(models.Model):
name = models.CharField(max_length=20, unique=True)
def __str__(self):
return self.name
class Works_in(models.Model):
emp_name = models.ForeignKey(User, related_name='works_emp_name', to_field='username', on_delete=models.CASCADE)
dept_name = models.ForeignKey(Department, blank=False, null=False, to_field='name',related_name='works_on_dept', on_delete=models.CASCADE)
def __str__(self):
return str(self.emp_name) + " " + str(self.dept_name)
根据文档here,您可以像这样使用接收器装饰器连接到信号,
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Works_in
@receiver(pre_save, sender=Works_in)
def my_handler(sender, **kwargs):
# Your pre_save logic here
if i_dont_want_to_save:
raise Exception('Dont save me!')
希望对您有所帮助!
在搜索并做了一些与问题中提到的我的需求相关的研究之后。我们可以为此覆盖模型内部的 clean 方法,并在 clean 方法内部引发错误,以防输入的数据不满足我们的逻辑
def clean(self):
# statements
if condition:
raise ValidationError('Error message')