Django入门教程(七):模型的一对多关系,多对多关系,外键foreign_key,笛卡儿积

大家好,我是连人,今天咱也不讲django了,来给大家讲讲哲学。

马克思主义哲学认为,世界是普遍联系的。任何事物都不能孤立地存在,都同其他事物发生着联系(点名批评数据库概论,教SQL语句用的都是没连接的表,一个select套另一个select看的我想吐)

在学校里,一个班有很多学生,一个老师可以教很多班,而一个班需要有很多老师来上课。在这之中,班对学生是一个一对多关系,老师对班是一个多对多关系。

今天我们用一个更好理解的例子,假设我们我们要开发一个餐厅网站,而你的甲方是一个大型餐厅,提供很多菜系,每个菜系下有很多菜。这个时候菜系对菜就是一个一对多关系。

甲方要求你整一个点餐系统,A顾客假如点了糖醋里脊,红烧鱼,白菜,B顾客可以点糖醋里脊,白菜,牛肉汤。在这种情况下,糖醋里脊和白菜都与A和B有关,而菜和顾客并不是从属关系,这是一个多对多关系。

下面实际操作:

class DishesType(models.Model):
    name = models.CharField(max_length=10, unique=True)

    def __str__(self):
        return self.name


class Guest(models.Model):
    name = models.CharField(max_length=10, unique=True)

    def __str__(self):
        return self.name


class Dishes(models.Model):
    name = models.CharField(max_length=10, unique=True)
    DType = models.ForeignKey(DishesType, on_delete=models.DO_NOTHING)    # 外键,与菜系一对多
    ordering = models.ManyToManyField(Guest, though='Ordering')           # 多对多关系

    def __str__(self):
        return self.name


class Ordering(models.Model):                         # 为了记录多对多关系,新建一个model记录额外信息,例如订单时间
    guest = models.ForeignKey(Guest, on_delete=models.DO_NOTHING)     # 两个依据使用外键关联
    dishes = models.ForeignKey(Dishes, on_delete=models.DO_NOTHING)
    time = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.guest.name + '-' + self.dishes.name

下面强调几个点:

ForeignKey: 常用的写法就是你要关联的model+on_delete选项。
on_delete表示删除外键时的操作,我们以菜系-菜为例介绍一下on_delete的字段

选项 作用
CASCADE 删除菜系且删除菜系下所有菜
PROTECT 删除菜系时报错,不删除菜
DO_NOTHING 单单删除外键,不动菜系和菜的信息
SET_NULL 将外键设为空,前提null=True
SET_DEFAULT 将外键设为默认值
SET() 设置为自己定义的值

我一般使用DO_NOTHING.

ManyToManyField: 定义多对多以及中间表。

通过顾客查询点的菜:
介绍一种写法

ordering_list = models.Ordering.objects.filter(guest=指定顾客)
for ordering in ordering_list:
    print (ordering.dishes.name)

admin界面: 一旦定义了ordering,则后台删除dishes会受阻,因为ordering的外键指向会为空,所以自己设计一个后台是必需的,不要依赖于django自己提供的管理页面。

转载注明出处。

发布了10 篇原创文章 · 获赞 1 · 访问量 730

猜你喜欢

转载自blog.csdn.net/mirocky/article/details/103956735
今日推荐