2016-03-28 12 views
0

我有這個使用繼承的模型設計實現,所以編輯器和作者是從人類繼承的,我這樣做是爲了當作者成爲編輯器或反之亦然時,我不會有重複的數據,當然也可以使如果我想顯示所有人,無論他們的工作描述如何(因爲他們都是人),列表更容易列出。如何在django中實現繼承來簡化和刪除數據重複?

現在我創建了我的代碼來做到這一點在Django中,並設置我的admin.py能夠快速添加數據,我的問題是它沒有做我認爲應該做的,我想當我添加作者,生病只是從下拉列表中選擇人的價值觀,並將其保存爲作者,但其顯示的名字,中間名,姓氏文本框等,而不是

我的問題是如何使它不適合只是從下拉選擇當我保存它時,從下拉列表中選擇的項目的ID將被保存,而不是整個文件名,中間名,姓氏等。(目前顯示運行時顯示的那個)

我檢查了生成的sq爲這些類創建命令,我發現編輯器和作者類使人成爲他們的FK,所以即時猜測它的可能性,但仍然沒有找到確切的解決方案。

下面是我寫的包含一些問題的代碼。非常感謝。

# model.py 
from __future__ import unicode_literals 

from django.db import models 

class Person(models.Model): 
    GENDER_CHOICES = (
     ('0','unknown'), 
     ('1','male'), 
     ('2','female'), 
    ) 
    firstname = models.CharField(max_length=50) 
    middlename = models.CharField(max_length=50, blank=True) 
    lastname = models.CharField(max_length=50) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default=0) 
    other_info = models.TextField(blank=True) 
    def __str__(self): 
     fullname = self.lastname + ', ' + self.firstname[0]+'.' 
     return fullname.encode("utf-8") 

class Editor(Person): 
    active = models.BooleanField(default=True) 
    years_experience = models.IntegerField() 

    def __str__(self): 
     fullname = self.lastname + ', ' + self.firstname[0]+'.' 
     return fullname.encode("utf-8") 

class Author(Person): 
    active = models.BooleanField(default=True) 
    def __str__(self): 
     fullname = self.lastname + ', ' + self.firstname[0]+'.' 
     return fullname.encode("utf-8") 


#admin.py 

from django.contrib import admin 

from .models import Person, Editor, Author 

admin.site.register(Person) 
admin.site.register(Editor) 
admin.site.register(Author) 

回答

0

好有兩兩件事這裏 -

  1. DB模式 - 在數據庫中生成的表結構。
  2. Django管理面板 - 這些模型如何在django管理面板中表示。

    • 現在你說,當前實現(繼承Person)正在生成數據庫結構細,即「EditorAuthor類使Person他們的FK」。

    • 這裏發生的事情是,django管理員只是看着處理它們的模型結構(CRUD操作),這就是爲什麼你在管理面板中獲取所有字段而不是下拉到Person

一種方式來解決這將是手動添加的,而不是使用繼承 -

class Editor(models.Model): 

    person = models.ForeignKey(Person) 
    active = models.BooleanField(default=True) 
    years_experience = models.IntegerField() 

    def __str__(self): 
     fullname = self.lastname + ', ' + self.firstname[0]+'.' 
     return fullname.encode("utf-8") 

class Author(models.Model): 

    person = models.ForeignKey(Person) 
    active = models.BooleanField(default=True) 
    def __str__(self): 
     fullname = self.lastname + ', ' + self.firstname[0]+'.' 
     return fullname.encode("utf-8") 

注FK: - 此外,你應該使用公共字段繼承(如active )通過抽象模型。文檔: - https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes

+0

它的工作原理,但有沒有辦法做到這一點使用繼承?即仍然必須從Person類繼承? – rcd