Django понимание ограничений uniq для вложенных моделей

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

Я хотел бы заверить, что человек уникален в одном отделе (значит, может иметь только одну должность в одном отделе). Мой подход заключался бы в использовании ограничения на позицию,
но я не могу понять

  1. Какой оператор 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-отношения от отдела к компании, и я хотел бы заверить, что человек уникален для компании? (извините, попробовал минимальный пример -.- не получилось …)