2017-02-17 127 views
0

我正在使用Django構建一個webapp,這將用於跟蹤人員和工作/演出空缺。我們試圖幫助的人的類型是不同的,但人們可能不止一個類別。如何在重疊項目中構造Django中的表格

舉一個更具體的例子,讓我們有演員,歌手,舞者。我可以設置三個表格:

class Actor(models.Model): 
    name = models.TextField(max_length=100) 
    dob = models.DateField() 
    email = models.EmailField() 
    number = models.TextField(max_length=15) 
    sex = models.TextField(max_length=1) 
    dramatic = models.BooleanField() 
    comedic = models.BooleanField() 
    height = models.DecimalField(max_digits=3, decimal_places=2) 
    weight = models.DecimalField(max_digits=5, decimals_places=2) 

class Singer(models.Model): 
    name = models.TextField(max_length=100) 
    dob = models.DateField() 
    email = models.EmailField() 
    number = models.TextField(max_length=15) 
    sex = models.TextField(max_length=1) 
    style = models.TextField(max_length=20) 
    range = models.TextField(max_length=50) 

class Dancer(models.Model): 
    name = models.TextField(max_length=100) 
    dob = models.DateField() 
    email = models.EmailField() 
    number = models.TextField(max_length=15) 
    sex = models.TextField(max_length=1) 
    style = models.TextField(max_length=20) 

這將是非常好的,因爲一長串的原因,能夠唯一識別人。如果我在sql中這樣做,我會有一個People表,其中我存儲了名稱,dob等信息。然後將包含PersonId的表作爲外鍵和所有actor的特定屬性。然後,我會創建一個視圖,讓我可以查看連接的數據。

但是,我也希望用戶能夠以單一形式輸入歌手的信息。即不必創建一個人,然後一旦他們填寫了表格person,請填寫另一個表格,將該人員添加爲歌手。

所以,畢竟,我的問題是:有沒有辦法設置Django,以便我可以有一個表單寫入多個表,並從多個表中返回信息,如視圖?如果我不能,那麼構建這樣的東西的最好方法是什麼?

即使指針正確的方向將不勝感激。我甚至不確定谷歌有什麼合適的條款。

回答

1

Django型號支持inheritance三種型號。聽起來好像你是在multi-table inheritance之後:

Django支持的第二種模型繼承類型是層次結構中的每個模型都是模型本身。每個模型對應於它自己的數據庫表,並且可以單獨查詢和創建。繼承關係引入子模型與其父母之間的鏈接(通過自動創建的OneToOneField)。例如:

from django.db import models 

class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 

class Restaurant(Place): 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 

所有Place領域也將在Restaurant是可用的,雖然數據將駐留在不同的數據庫表。因此,這些都是可能的:

>>> Place.objects.filter(name="Bob's Cafe") 
>>> Restaurant.objects.filter(name="Bob's Cafe") 

像往常一樣,你可以使用the adminModelForm暴露您的任何車型給用戶。

+0

謝謝。我知道我不能成爲第一個有這個問題的人。 –