Ограничение модели Джанго для связанных объектов - PullRequest
4 голосов
/ 19 марта 2019

У меня есть следующий код для моделей:

class Tag(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)

class Activity(models.Model):
    user = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag, through='TagBinding')

class TagBinding(models.Model):
    tag = models.ForeignKey(Tag)
    activity = models.ForeignKey(Activity)

Я хочу написать ограничение базы данных для модели TagBinding, используя новый синтаксис Django 2.2. Это ограничение должно проверить, что поля tag и activity модели TagBinding имеют одного и того же пользователя. Что я пытался сделать:

class TagBinding(models.Model):
    tag = models.ForeignKey(Tag)
    activity = models.ForeignKey(Activity)

    class Meta:
        constraints = [
            models.CheckConstraint(
                name='user_equality',
                check=Q(tag__user=F('activity__user')),
            )
        ]

Но это не работает, потому что Django не позволяет использовать соединения внутри функции F. Также Subquery с OuterRef у меня не работало, потому что модели, на которые ссылались в запросе, не были зарегистрированы.

Можно ли как-нибудь реализовать это ограничение, используя новый синтаксис без необработанного SQL?

Обновление

Кажется, что некоторые бэкэнды SQL не поддерживают объединения в определении ограничений, поэтому возникает вопрос: возможно ли вообще реализовать это поведение в реляционной базе данных?

...