python - Django 模型继承与 OneToOne 字段

标签 python django django-models django-forms

编辑:两种方法的优点和缺点。 所以, 我有三个模型:Person、Client、Member Person 是一个基本模型,Client 和 Member 是 Person 的配置文件。

class Person(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        verbose_name=_('email address'),
        max_length=255,
        unique=True,
    )

class Client(User): #or maybe models.Model and explicit OneToField 
    first_name = models.CharField(verbose_name=_('first name'), max_length=30)
    last_name = models.CharField(verbose_name=_('last name'), max_length=30)

class Member(User): #or maybe models.Model and explicit OneToField 
    description = models.CharField(verbose_name=_('first name'), max_length=255)
   # other stuff

那么,我想要什么?

  1. 在管理中,当我们添加客户或成员时,我想填写字段电子邮件(基类中的字段),就像在派生类中一样。例如,在管理中 list_display = ('email', 'first_name').不为用户选择框。

  2. Person 类可以单独实例化,并“附加”到创建的配置文件上。就像 person=Person(email="[email protected] "),client = Client(person=person,first_name="test"...)。特别是,这应该适用于表单。当用户(人)通过身份验证时,我希望能够填写个人资料(客户)表单并将人员附加到此表单。

  3. 一个人可以拥有两个帐户。如果我删除客户/成员(member),相应的人不应该被删除。

第三个选项实际上不是必需的,但它对我知道如何去做很有用。

所以,选项1通过继承完美解决,Person就是User,但是当实现选项2时,这种方式就失败了。由于 PersonClient 被视为一个整体,因此我无法附加用户,出现重复 key 错误。

选项 2 通过扩展 models.Model 并附加 person=models.OnetoOneField(Person,primary_key=True) 来解决。但是,管理已损坏(第一个选项),因为客户端没有电子邮件等字段。

那么,要采取什么方法来解决上述问题呢? 有简单的方法吗? 如果没有简单的方法,是否有高级方法,例如覆盖元类、对象描述符或编写自定义 OneToOne 字段?

欢迎任何建议。

谢谢。

最佳答案

您可以使用post_delete signal为此。

所以你会:

  • 在两个模型上注册 post_delete 信号
  • 一次删除,检查另一个对象是否存在,然后删除。

StackOverflow 上有很多关于 post_delete 信号实现的示例,因此我将省略该部分。

关于python - Django 模型继承与 OneToOne 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015316/

相关文章:

python - I/O 密集型串行端口应用程序 : Porting from Threading, 基于队列的异步设计(ala Twisted)

python - Django:过滤多个参数

python - 无法与 GeoDjango 合并范围聚合

python - 带有外键字段列表的 Django 表单

python - scikit-learn 中 ColumnTransformer 的自定义转换器问题

python - 将 python 用于 MySQL 的 INSERT

python - pandas是否支持使用read_csv读取 `set`参数

python - Django 模型类在管理器中为 None

mysql - Django - 访问 mySQL 数据库中预先存在的数据

python - 使用 django ORM 获取只有最新 child 的 parent 的优化方法