Правильный способ моделирования отношений "один к одному" в Django

Я ищу правильный способ моделирования таких утверждений в Django:

 1. "A Condition has exactly 2 Blocks: leftBlock and rightBlock"
 2. "LeftBlock and RightBlock have the same fields in common"
 3. "Blocks must be different in a Condition"
 4. "A Block only belongs to 1 Condition"

Вот мои рассуждения:

  • Я выделил 2 модели: Условие и Блок.
  • Чтобы выразить 1, условие должно иметь 2 поля с именами типа "левый_блок" "правый_блок"
  • .
  • Для выражения 2 достаточно одной модели под названием Block вместо двух лишних.
  • Что касается 3, это может быть сделано с помощью DJango CheckConstraint, но я не уверен.
  • Что касается 4, я считаю, что у нас есть отношения один-к-одному между условием и блоком.

Наконец, мои модели:

class Condition(models.Model):
    condition_id = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    left_block = models.OneToOneField(Block, on_delete=models.CASCADE, null=True, related_name='left_block')
    right_block = models.OneToOneField(Block, on_delete=models.CASCADE, null=True, related_name='right_block')

class Block(models.Model):
    block_id = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False, unique=True)
    name = models.CharField(max_length=16)

Итак, правильно ли это? Если нет, то как я могу справиться с такой ситуацией?

Вернуться на верх