[英]Django Model Inheritance versus OneToOne field
編輯:兩種方法的優缺點。 因此,我有三種模型:人員,客戶,成員人員是基本模型,客戶和成員是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 list_display =('email','first_name')中。 不為用戶選擇框。
可以單獨實例化Person類,並將其“附加”到創建的配置文件中。 像person = Person(email =“ test@gmail.com”),client = Client(person = person,first_name =“ test” ...)。 特別是,這應該以表格形式工作。 用戶(人員)通過身份驗證后,我希望能夠填寫個人資料(客戶)表格並將人員附加到此表格中。
一個人可以同時擁有兩個帳戶。 如果我刪除客戶/成員,則不應刪除相應的人。
第三選項實際上不是必需的,但對我來說知道如何做是很有用的。
因此,選項1通過繼承完美地解決了, Person
是User
,但是當實現選項2時此方法失敗。 由於Person
和Client
被視為一個整體,因此我無法附加用戶,重復鍵錯誤。
選項2通過擴展models.Model並追加person=models.OnetoOneField(Person,primary_key=True)
。 但是,管理員已損壞(第一種選擇),因為客戶端沒有電子郵件之類的字段。
那么,為了解決上述問題采取什么方法呢? 有簡單的方法嗎? 如果沒有簡單的方法,是否有高級的方法,例如覆蓋元類,對象描述符或編寫自定義的OneToOne字段?
任何建議都歡迎。
謝謝。
您可以為此使用post_delete
信號 。
因此,您將:
post_delete
信號 關於StackOverflow上post_delete
信號的實現,有很多示例,因此我將省略這一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.