编辑:两种方法的优点和缺点。 所以, 我有三个模型:人,客户,会员 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
那么,我想要什么?
在admin中,当我们添加客户端或成员时,我想填写字段电子邮件(基类中的字段),就像它在派生类中一样。例如,在admin list_display =(' email',' first_name')中。不为用户选择框。
人员类可以单独实例化,并附加"创建的profiel。就像person = Person(email =" test@gmail.com"),client = Client(person = person,first_name =" test" ...)。特别是,这应该以表格形式工作。当用户(人)通过身份验证时,我希望能够填写个人资料(客户)表单并将此人附加到此表单。
一个人可以拥有这两个帐户。如果删除客户/会员,则不应删除相应的人。
第三个选项实际上没有必要,但对我来说知道如何做是很有用的。
因此,选项1通过继承完美解决,Person
为User
,但是当实现选项2时,此方法失败。由于Person
和Client
被视为一个整体,因此我无法附加用户,重复密钥错误。
通过扩展models.Model并附加person=models.OnetoOneField(Person,primary_key=True)
来解决选项2。但是,管理员已损坏(第一个选项),因为客户端没有像电子邮件这样的字段。
那么,采取什么方法来解决上述问题? 有简单的方法吗? 如果没有简单的方法,是否有先进的方法,如重写元类,对象描述符或编写自定义OneToOne字段?
欢迎任何建议。
谢谢。
答案 0 :(得分:2)
您可以使用post_delete
signal进行此操作。
所以你会:
post_delete
信号在StackOverflow上有很多关于post_delete
信号实现的例子,所以我将把这部分留下来。