Как я могу добавить ограничение Django, которое ограничивает количество внешних ключей на основе значения столбца? - PullRequest
0 голосов
/ 27 мая 2020

Рассмотрим следующий код:

(Используя Python 3,7 и Django 2,2)

from django.core.validators import MinValueValidator
from django.db import models


class Parent(models.Model):
    limit = models.IntegerField(validators=[MinValueValidator(1)])


class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children')

Можно ли добавить CheckConstraint так, чтобы количество разрешенных Дочерний элемент для каждого Родителя ограничен полем limit в Parent. Например, что-то вроде следующего в таблице Parent:

models.CheckConstraint(
    check=models.Q(limit__gte=models.Count('children')),
    name='children_limit',
)

Но это не удается с

django.core.exceptions.FieldError: Joined field references are not permitted in this query

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

1 Ответ

1 голос
/ 27 мая 2020

Вы можете использовать валидатор в дочерней модели следующим образом:

def restrict_amount(value):
    parent = Parent.objects.filter(pk=value).get()
    if parent.children.count() >= parent.limit:
        raise ValidationError(f'Parent already has maximal amount of children ({parent.limit})')


class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children', validators=(restrict_amount, ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...