【问题标题】:Checking condition before inserting data to a table in Django在将数据插入到 Django 中的表之前检查条件
【发布时间】:2020-02-16 04:19:29
【问题描述】:

我有 5 个表 User(即 Employee)、PositionsEmp_position(这是 Employee 和 Positions 之间的关系表)。我有一个部门表,其中包含我公司所有部门的列表和一个关系表Works_in,它将User(Employee) 映射到一个部门。现在在 Works_in 表中,当我将 User(Employee) 映射到 Department 时,我想检查我是否在 Works_in(relationship) 表中插入了数据。那就是将员工映射到一个部门,是否已经映射了一个经理。

例子:

员工

Himanshu
Bassi
BB

位置

Developer
Manager
Tester

Emp_position(关系表)

Employee    Position
Himanshu    Developer
Bassi       Manager
BB          Manager

部门

Web UI
Data Analysis
Machine Learning

Works_in(关系表)

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 表之前检查要映射到某个部门的部门是否已经有一个映射到它的经理。所以我想在将数据插入到我的 Works_in 表之前进行检查。

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

【问题讨论】:

标签: python django django-models orm entity-relationship


【解决方案1】:

根据文档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!')

希望这会有所帮助!

【讨论】:

  • 但是当满足条件时,我如何拒绝保存,即向表单抛出验证错误
  • 非常感谢,我会尝试一次,一旦成功就会接受您的回答
  • 验证错误和异常引发表单提交错误。我想要数据无效表单下方的表单错误
  • 您在上面的问题中没有提到您有任何形式。这将在应用程序级别引发异常。如果您有表单,只需在您的表单清理方法中添加检查docs.djangoproject.com/en/2.2/ref/forms/validation/…
  • 这实际上不是 django 管理表单,我正在从 django 管理页面添加数据。请看这个stackoverflow.com/questions/58464033/…
【解决方案2】:

在搜索并进行了一些与问题中提到的我的需求相关的研究之后。我们可以为此覆盖模型内部的 clean 方法,并在 clean 方法内部引发错误,以防输入的数据不满足我们的逻辑

def clean(self):
    # statements
    if condition:
         raise ValidationError('Error message')

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多