簡體   English   中英

Django模型繼承與OneToOne字段

[英]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

所以,我想要什么?

  1. 在管理員中,當我們添加客戶端或成員時,我想填充字段電子郵件(來自基類的字段),就像它在派生類中一樣。 例如,在admin list_display =('email','first_name')中。 不為用戶選擇框。

  2. 可以單獨實例化Person類,並將其“附加”到創建的配置文件中。 像person = Person(email =“ test@gmail.com”),client = Client(person = person,first_name =“ test” ...)。 特別是,這應該以表格形式工作。 用戶(人員)通過身份驗證后,我希望能夠填寫個人資料(客戶)表格並將人員附加到此表格中。

  3. 一個人可以同時擁有兩個帳戶。 如果我刪除客戶/成員,則不應刪除相應的人。

第三選項實際上不是必需的,但對我來說知道如何做是很有用的。

因此,選項1通過繼承完美地解決了, PersonUser ,但是當實現選項2時此方法失敗。 由於PersonClient被視為一個整體,因此我無法附加用戶,重復鍵錯誤。

選項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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM