Django user_auth как сделать внешний ключ один ко многим
Я хочу, чтобы многие пользователи могли быть частью одного арендатора, поэтому моя идея заключалась в том, чтобы использовать внешний ключ от пользователя к арендатору, но я не могу найти, как это сделать. Вот что у меня есть на данный момент:
models.py
class Tenants(models.Model):
empresa = models.CharField(max_length=60, null=False, blank=False)
sub_dominio = models.CharField(max_length=60, null=True, blank=True)
usuario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.CharField(max_length=20, null=False, blank=False)
class Meta:
verbose_name_plural = "Tenants"
def __str__(self):
return self.empresa
Но с этим решением я могу иметь только одного пользователя на арендатора, как я могу сделать много пользователей на одного арендатора?
Я понял, что вы подключаете несколько пользователей к модели арендаторов. Внешний ключ должен генерироваться пользователем в обратном порядке.
tenants/models.py
from django.db import models
# Create your models here.
class Tenants(models.Model):
empresa = models.CharField(max_length=60, null=False, blank=False)
sub_dominio = models.CharField(max_length=60, null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.CharField(max_length=20, null=False, blank=False)
class Meta:
verbose_name_plural = "Tenants"
def __str__(self):
return self.empresa
users/models.py
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import UserManager, PermissionsMixin
from tenants.models import Tenants
# Create your models here.
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
username = models.CharField(
max_length=150,
unique=True,
)
email = models.EmailField(blank=True)
is_staff = models.BooleanField(
default=False,
)
is_active = models.BooleanField(
default=True,
)
tenants = models.ForeignKey(Tenants, on_delete=models.SET_NULL, null=True, related_name='users')
EMAIL_FIELD = "email"
USERNAME_FIELD = "username"
REQUIRED_FIELDS = ["email"]
def __str__(self):
return self.username
Строго говоря, вы можете добавить ForeignKey
из модели пользователя в Tenant
, даже если эта модель существует, просто выполнив логику, которую использует сам Django:
from django.contrib.auth import get_user_model
class Tenant(models.Model):
empresa = models.CharField(max_length=60, null=False, blank=False)
sub_dominio = models.CharField(max_length=60, null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.CharField(max_length=20, null=False, blank=False)
class Meta:
verbose_name_plural = 'Tenants'
def __str__(self):
return self.empresa
user = get_user_model()
models.ForeignKey(
Tenant, on_delete=models.CASCADE, null=True
).contribute_to_class(User, 'tenant')
внизу, мы таким образом добавляем поле с именем tenant
в модель User
. Но я не думаю, что это хорошая идея. Если вам нужно обновить модель пользователя, обычно вы создаете собственную модель.
Note: Normally a Django model is given a singular name [django-antipatterns], so
Tenant
instead of.Tenants