编辑:两种方法的优点和缺点。 所以, 我有三个模型: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
那么,我想要什么?
在管理中,当我们添加客户或成员时,我想填写字段电子邮件(基类中的字段),就像在派生类中一样。例如,在管理中 list_display = ('email', 'first_name').不为用户选择框。
Person 类可以单独实例化,并“附加”到创建的配置文件上。就像 person=Person(email="[email protected] "),client = Client(person=person,first_name="test"...)。特别是,这应该适用于表单。当用户(人)通过身份验证时,我希望能够填写个人资料(客户)表单并将人员附加到此表单。
一个人可以拥有两个帐户。如果我删除客户/成员(member),相应的人不应该被删除。
第三个选项实际上不是必需的,但它对我知道如何去做很有用。
所以,选项1通过继承完美解决,Person
就是User
,但是当实现选项2时,这种方式就失败了。由于 Person
和 Client
被视为一个整体,因此我无法附加用户,出现重复 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/