Проверка состояния перед вставкой данных в таблицу в Django - PullRequest
1 голос
/ 19 октября 2019

У меня есть 5 таблиц User (т. Е. Сотрудник), Positions и Emp_position (это таблица отношений между сотрудником и должностями). У меня есть таблица отделов, которая содержит список всех отделов в моей компании и таблицу взаимосвязей Works_in, которая сопоставляет User (сотрудник) с отделом. Теперь в таблице Works_in, когда я сопоставляю User (Сотрудник) с Department, я хочу проверить, какие данные я вставляю в таблицу Works_in (взаимосвязь). То есть при сопоставлении сотрудника с отделом уже назначен менеджер или нет.

Пример:

Сотрудник

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

Каждый сотрудник будет сопоставлен с отделом, но в отделе не должно быть нескольких менеджеров. Здесь, поскольку Басси и БиБи - менеджер, мы не хотим, чтобы они были сопоставлены с одним и тем же отделом. Поэтому для этой цели я хочу проверить, прежде чем данные 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)

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Основываясь на документации здесь , вы можете использовать декоратор приемника для подключения к сигналу, подобному этому,

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

Надеюсь, это поможет!

0 голосов
/ 19 октября 2019

После поиска и проведения некоторых исследований, связанных с моими потребностями, как указано в вопросе. Для этого мы можем переопределить метод очистки внутри модели и вызвать ошибку внутри метода очистки в случае, если введенные данные не удовлетворяют нашей логике

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