大家好,我是连人,今天咱也不讲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自己提供的管理页面。
转载注明出处。