Python 在Django中将数据插入表之前检查条件

Python 在Django中将数据插入表之前检查条件,python,django,django-models,orm,entity-relationship,Python,Django,Django Models,Orm,Entity Relationship,我有5个表User(即员工)、Positions和Emp\u position(这是员工和职位之间的关系表)。我有一个部门表,其中包含公司所有部门的列表,还有一个关系表Works\u in,它将User(Employee)映射到一个部门。现在,当我将用户(员工)映射到部门时,在Works\u in表中,我要检查插入Works\u in(关系)表中的数据是否正确。这就是将员工映射到某个部门是否已映射到某个经理 例如: 员工 Himanshu Bassi BB 位置 Developer Manag

我有5个表
User
(即员工)、
Positions
Emp\u position
(这是员工和职位之间的关系表)。我有一个部门表,其中包含公司所有部门的列表,还有一个关系表
Works\u in
,它将
User
(Employee)映射到一个部门。现在,当我将
用户
(员工)映射到
部门
时,在Works\u in表中,我要检查插入Works\u in(关系)表中的数据是否正确。这就是将员工映射到某个部门是否已映射到某个经理

例如:

员工

Himanshu
Bassi
BB
位置

Developer
Manager
Tester
Emp_位置(关系表)

部门

Web UI
Data Analysis
Machine Learning
中起作用(关系表)

每个员工都将映射到一个部门,但一个部门不应该有多个经理。在这里,因为Bassi和BB是经理,我们不希望他们被映射到同一个部门。因此,在将数据
BB Web UI
插入表中的Works\u之前,我想检查将要映射到某个部门的部门是否已映射到某个经理。所以我想在将数据插入表中的Works_之前包含一个检查

这是我的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)

根据文档,您可以使用接收器装饰器连接到这样的信号

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')

您指的是预存信号吗?文档并没有告诉我如何重写pre)save方法。你能帮我解决这个问题吗检查我下面的答案但我如何拒绝保存,当条件满足时,即向表单抛出验证错误非常感谢,我将尝试一次,一旦成功,我将接受你的答案验证错误和异常引发表单提交错误。我想要的是表格下面的表格错误,即数据无效。您在上面的问题中没有提到您有任何表格。这将在应用程序级别引发异常。如果你有一个表单,只需在表单中添加check clean方法不,这实际上是django管理表单,我正在从django管理页面添加数据。请看这个
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!')
def clean(self):
    # statements
    if condition:
         raise ValidationError('Error message')