Пользовательская модель фреймворка отдыха 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
, потому что если организация удалена, то Пользователь тоже не должен быть удален.