Django模型继承与OneToOne字段

时间:2015-01-18 22:03:15

标签: python django django-models django-forms

编辑:两种方法的优点和缺点。 所以, 我有三个模型:人,客户,会员 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. 在admin中,当我们添加客户端或成员时,我想填写字段电子邮件(基类中的字段),就像它在派生类中一样。例如,在admin list_display =(' email',' first_name')中。不为用户选择框。

  2. 人员类可以单独实例化,并附加"创建的profiel。就像person = Person(email =" test@gmail.com"),client = Client(person = person,first_name =" test" ...)。特别是,这应该以表格形式工作。当用户(人)通过身份验证时,我希望能够填写个人资料(客户)表单并将此人附加到此表单。

  3. 一个人可以拥有这两个帐户。如果删除客户/会员,则不应删除相应的人。

  4. 第三个选项实际上没有必要,但对我来说知道如何做是很有用的。

    因此,选项1通过继承完美解决,PersonUser,但是当实现选项2时,此方法失败。由于PersonClient被视为一个整体,因此我无法附加用户,重复密钥错误。

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

    那么,采取什么方法来解决上述问题? 有简单的方法吗? 如果没有简单的方法,是否有先进的方法,如重写元类,对象描述符或编写自定义OneToOne字段?

    欢迎任何建议。

    谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用post_delete signal进行此操作。

所以你会:

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

在StackOverflow上有很多关于post_delete信号实现的例子,所以我将把这部分留下来。