如何在重叠项目的Django中构建表

时间:2017-02-17 02:32:59

标签: python django django-models

我正在使用Django构建一个webapp,这将用于跟踪人员和工作/演出空缺。我们尝试提供帮助的人的类型是截然不同的,但人们可能属于多个类别。

举一个更具体的例子,让我有演员,歌手,舞者。我可以设置三个表:

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表,其中我存储了诸如name,dob等信息。然后将Actors表包含PersonId作为外语key,以及所有actor特定属性。然后,我创建了一个允许我查看已连接数据的视图。

但是,我也希望用户能够以单一形式输入歌手的信息。即不必创建一个人,然后一旦他们填写person表格,填写另一个表格,将该人添加为歌手。

所以,毕竟,我的问题是:有没有办法设置Django,以便我可以有一个表单写入多个表,并从多个表返回信息,如视图?如果我不能,那么构建这样的东西的最佳方法是什么?

即使是正确方向的指针也会受到赞赏。我甚至不确定谷歌的正确用语是什么。

1 个答案:

答案 0 :(得分:1)

Django模型支持三种inheritance模型。这听起来像是你multi-table inheritance之后:

  

Django支持的第二种模型继承是当层次结构中的每个模型都是模型本身时。每个模型对应于自己的数据库表,可以单独查询和创建。继承关系引入子模型与其每个父模型之间的链接(通过自动创建的OneToOneField)。例如:

template<class T>
struct IntegerType
{
    T value;

    //Next line causes errors
    constexpr IntegerType(IntegerType& value) : value(value.value) { }
    constexpr IntegerType(T value) : value(value) { }
};
template<class int_t>
class FullMult{
    int_t value;
    int_t carry;
    public:

    constexpr FullMult() : value(0), carry(0) { }
    constexpr FullMult(const int_t& value, const int_t& carry) : value(value), carry(carry) { }

};

int main()
{
    FullMult<IntegerType<unsigned int> > thing 
        = FullMult<IntegerType<unsigned int> >(
            IntegerType<unsigned int>(12),IntegerType<unsigned int>(12));
}
     

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

像往常一样,您可以使用the adminModelForm向用户展示您的任何模型。