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.

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