#django #django-models
#django #django-модели
Вопрос:
Имея следующую модель
class Department(models.Model):
name = models.CharField(max_length=10)
class Person(models.Model):
name = models.CharField(max_length=10)
class Position(models.Model):
name = models.CharField(max_length=10)
person = models.ForeignKeyField(to=Position)
department = models.ForeignKeyField(to=Department)
Я хотел бы заверить, что человек уникален в одном отделе (значит, может иметь только одну должность в одном отделе). Мой подход заключался бы в использовании ограничения на позицию,
но я не могу понять
- Какой оператор Q использовать для условия.
class Position(models.Model):
name = models.CharField(max_length=10)
person = models.ForeignKeyField(to=Position)
department = models.ForeignKeyField(to=Department)
class Meta:
constraints = UniqueConstraint(fields=['person'], condition=Q(???))
Я ожидал бы, что будет что-то подобное Q(<all_departments>)
, чего я не смог найти
РЕДАКТИРОВАТЬ: что, если существует более сложная взаимосвязь:
class Company(models.Model):
name = models.CharField(max_length=10)
class Department(models.Model):
name = models.CharField(max_length=10)
models.ForeignKey(to=Company)
class Person(models.Model):
name = models.CharField(max_length=10)
class Position(models.Model):
name = models.CharField(max_length=10)
person = models.ForeignKeyField(to=Position)
department = models.ForeignKeyField(to=Department)
и у человека должна быть только одна должность в компании?
Ответ №1:
Что вам нужно, так это просто UniqueConstraint со списком полей
UniqueConstraint(fields=['person', 'department'], name='unique_department_person')
Это гарантирует, что в базе данных существует только одна комбинация одного и того же человека и отдела
Комментарии:
1. Итак, и если бы у меня были также FK-отношения от отдела к компании, и я хотел бы заверить, что человек уникален для компании? (извините, попробовал минимальный пример -.- не получилось …)