Пользовательская модель фреймворка отдыха Django, ссылающаяся на несколько других моделей

У меня есть несколько моделей, таких как:

class Organization(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   ....

class Customer(models.Model):
       id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
       ....

class Supplier(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   ....

Каждая модель имеет своего собственного одного или более пользователей, я создал модель пользователя следующим образом:

class User(AbstractBaseUser, PermissionsMixin):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  email_address = models.EmailField(max_length=255, unique=True)
  name = models.CharField(max_length=255)

Мой вопрос в том, как я могу создать отношения между пользователем и организацией, клиентом, поставщиком...? Я нашел одно решение, например:

class User(AbstractBaseUser, PermissionsMixin):
  id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  email_address = models.EmailField(max_length=255, unique=True)
  name = models.CharField(max_length=255)
  organization = models.ForeignKey(Organization)
  customer = models.ForeignKey(Organization)
  supplier = models.ForeignKey(Supplier)

Что мне не понравилось делать, потому что у меня есть несколько моделей, у которых есть свои пользователи. Другой способ, который я нашел, это GenericForeignKey Relationship, но тоже не очень хорошее решение. Одной из причин этого является то, что у меня есть больше моделей для реализации подобных отношений, что становится очень сложным. Может ли кто-нибудь предложить элегантное решение для этого? Заранее спасибо!

Не лучший способ сделать это в user, Добавьте пользователя в качестве внешнего ключа из Models следующим образом,

class Organization(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   ...

Если у вас несколько пользователей для одной организации, создайте отдельную таблицу для работы с отношениями или используйте множество отношений.

Я думаю, что в данном случае вам следует использовать

class Organization(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   user = models.ForeignKey(User, on_delete=models.SET_NULL)

models.SET_NULL здесь подходит больше, чем models.CASCADE, потому что если организация удалена, то Пользователь тоже не должен быть удален.

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