使用 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 上下文类型,并且根据您看到的类型可以看到下拉列表。