使用 2 种不同的模型创建外键引用作为选择
Creating ForeignKey reference with 2 different models as choice
这是我想尝试的,我有一个继承自带有自定义管理器的抽象用户的用户模型,我需要在 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 内容类型框架吗?看看吧here
这可以帮助您实现您想要的。
Here 是一篇非常简单易懂的文章。
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 创建对象时,您可以 select ModelA 或 ModelB,然后是对象的 ID。
如果您有自己的 CRUD 页面模板或正在使用 API 进行 CRUD 操作,那么填充数据将非常容易。如果您使用的是表单,那么您可能需要制作一个自定义字段,这样您就可以 select 上下文类型,并且根据您看到的类型可以看到下拉列表。
这是我想尝试的,我有一个继承自带有自定义管理器的抽象用户的用户模型,我需要在 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 内容类型框架吗?看看吧here
这可以帮助您实现您想要的。
Here 是一篇非常简单易懂的文章。
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 创建对象时,您可以 select ModelA 或 ModelB,然后是对象的 ID。
如果您有自己的 CRUD 页面模板或正在使用 API 进行 CRUD 操作,那么填充数据将非常容易。如果您使用的是表单,那么您可能需要制作一个自定义字段,这样您就可以 select 上下文类型,并且根据您看到的类型可以看到下拉列表。