У меня есть следующий код для моделей:
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 не поддерживают объединения в определении ограничений, поэтому возникает вопрос: возможно ли вообще реализовать это поведение в реляционной базе данных?