Создание ссылки ForeignKey с 2 различными моделями в качестве выбора
Вот что я хочу попробовать, у меня есть модель User, унаследованная от Abstract user с пользовательским менеджером, мне нужно поле в модели CustomUser, чтобы выбрать либо модель продавца, либо модель клиента
class CustomUser(AbstractUser):
is_seller = models.BooleanField(default=False)
is_customer = models.BooleanField(default=False)
user_type = ? "I want to have a choice feild to choose either Seller or
Customer model"
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = CustomUserManager()
class CustomUserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, email, password=None, **extra_fields):
if not email:
return ValueError('Email required')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff true')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser true')
return self.create_user(email, password, **extra_fields)
class SellerDetails(models.Model):
pass
class CustomerDetails(models.Model):
pass
Вы смотрели на Django Content Types Framework? Взгляните на него здесь
Это может помочь вам в достижении желаемого.
Здесь есть очень простая для понимания статья об этом.
GenericForeignKey - это решение. В Django есть хорошая функция, называемая общим внешним ключом. В этом конкретном типе поля вы можете сохранить любой тип объекта, только нужно указать, на какой тип объекта он ссылается. Ниже я привел для вас пример:
class ModelA(models.Model):
achar = models.CharField(
max_length=255,
blank=True,
default="",
)
class ModelB(models.Model):
achar = models.CharField(
max_length=255,
blank=True,
default="",
)
class ModelC(models.Model):
achar = models.CharField(
max_length=255,
blank=True,
default="",
)
content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
Теперь, при создании объекта для ModelC, вы можете выбрать ModelA или ModelB, а затем id объекта.
Если у вас есть свой собственный шаблон страницы CRUD или вы используете API для выполнения операции crud, то заполнить данные будет очень просто. Если вы используете форму, то вам может понадобиться сделать пользовательское поле, чтобы вы могли выбрать тип контекста и на основе типа отобразить выпадающий список.