2017-02-17 124 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

谢谢。我知道我不能成为第一个有这个问题的人。 –