2017-08-13 72 views
0

免責聲明:我是Django的新手,所以我仍在學習Django的做事方式。爲與已註冊模型的父級具有FK關係的模型創建TabularInline

我正在處理的項目有一個u User模型和一個Student模型。以前,UserAdmin對兩款機型都承擔了雙重責任,但現在是創建獨立StudentAdmin的時候了,它允許管理員輕鬆編輯/創建/ etc學生。

User包含Student(即第一個和最後一個姓名,電子郵件,電話等)和Student含有較多的信息(即父電話,階級,待辦事項等)的基礎信息。 「班級」,「成績」等相關模型與FK的關係爲User,起初這並不是我的問題。

但是,當我重新使用在新的StudentAdmin中爲UserAdmin創建的內聯類時,我遇到了此錯誤:<class 'my_project.admin.TodoInline'>: (admin.E202) 'my_project.Todo' has no ForeignKey to 'my_project.Student。這並不奇怪,所以我想我可以僅僅覆蓋TodoInline上的_init_方法來使用parent_model.user,但後來我遇到了有關ForwardOneToOneDescriptor和缺少_meta字段的錯誤。考慮到這個用例,我相信必須有一個解決方案,但是我目前正在爲Django相關詞彙的進一步研究這個問題而蒙受損失。

class TodoInline(admin.TabularInline): 
    model = Todo 
    fields = ['content', 'completed', 'category', 'due_date'] 
    verbose_name_plural = "To-do's" 
    extra = 0 

    # This doesn't work: 
    def __int__(self, parent_model, admin_site): 
     super(TodoInline, self).__init__(parent_model.user, admin_site) 

如果這個問題的答案是重新定義模型之間的FK關係,那是我目前無法做到的。我需要一種解決方案,使我能夠重新定向內聯類(TodoInline只是StudentAdmin所需的許多內容之一),以便在Student模型上使用相關的User模型。先謝謝你!

回答

0

儘管您沒有重新配置外鍵的限制,但我在這裏只看到一種可能的解決方案,它有兩種不同的模型。

但首先:如果出現錯誤,則需要模型student的外鍵,爲什麼不能重新配置該外鍵?

第二種:您想要訪問student的父模型,並且您有user模型的外鍵。從建模的角度來看,我想知道,這是如何有用的 - 因爲你想與學生一起工作,而不是與用戶一起工作?此外,如果您的studentuser相關,則可以通過student訪問所有user屬性。因此,避免重新配置外鍵是沒有任何意義的。

因此,只有兩種可能(和有意義)modellings我看到的是:

(1)studentuser繼承模型,因此student擁有所有字段的和正在實施user方法。然後重新配置的外鍵student(要求$ python manage.py makemigrations <app>$ python manage.py migrate <app>

(2) 定義studentuser之間的一對一的關係,所以一個學生是唯一的user 。這也需要重新配置您的外鍵,如(1)中所述。

如果studentuser的不同之處是(3)選項:代理模式。通過代理模型,您可以爲一個模型實施多個模型管理。

+0

也許我應該在我的解釋中更詳細。 '學生'確實對'用戶'擁有FK,因此一個學生與一個用戶相關聯;棘手的部分是所有與學生相關的模型(例如'Todo','Class','School'等等)都將FKs保存爲'User',而不是'Student'。這是模式的一個不幸設計,目前我還沒有做任何事情,所以理想的解決方案將允許我將這些模型作爲內聯添加到管理工具中的「StudentForm」。然而,從'User'繼承'Student'會很好,但是那艘船已經航行了。 – Epps

+0

然後,您可以使用該'ForeignKey'反向(請參閱[django文檔](https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward))。 django提供了一個管理器來獲取反向'ForeignKey'關係的查詢集。通過這個,你可以通過'user'獲得'學生'。我不知道管理員內聯可能如何設計 - 我從來沒有做到這一點。但考慮到你現有的關係的相反,它應該是可能的。 –

相關問題