class Subject(models.Model):
id = models.AutoField(primary_key=True)
name = models. CharField(max_length=32)
price = models.IntegerField()
def __str__(self):
return self.name
学生模型类中需要关联外键,外键关联到学科模型,删除方式设置成级联删除
学生模型类如下:
class Student(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
#to表示要关联的表格
#on_delete表示删除表格时的策略,models.CASCADE是级联删除,当删除学科的时候student也被删除掉。
#在表格中会默然增加_id,比如这里的名字叫subject,迁移完成后,外键字段的名字就会变成subject_id
subject = models.ForeignKey(to='Subject',on_delete=models.CASCADE)
关于正向查询与反向查询
简单的可以理解为:从有外键的一方,向没有外键一方非查询称为正向查询。从没有外键的一方,向有外键的一方查询称为反向查询。
示例如下图:
查询张三对应的学科
student_obj = models.Student.objects.get(name='zs')
subject_obj = models.Subject.objects.get(id=student_obj.subject_id)
print(student_obj,'*',subject_obj)
查询张三对应的学科
zs对应的学科,下面这种方法当查到张三的全部信息后,选择张三整条信息中的外键部分字段,就能获取到对应的信息
student_obj = models.Student.objects.get(name='zs')
subject_obj = student_obj.subject #python
print(subject_obj)
查询学python的学员
反向查询(从没有外键的一边向带外键属性的一边查询),默认使用 类名小写__set查询
sub_obj = models.Subject.objects.get(name='python')
ret = sub_obj.student_set.all() #反向查询(从没有外键的一边向带外键属性的一边查询),默认使用 类名小写__set查询
print(ret)
sub_obj = models.Subject.objects.get(name='python')
stu_obj = models.Student()
stu_obj.name = '刘备'
stu_obj.subject = sub_obj
stu_obj.save()
sub_obj = models.Subject.objects.get(name='java')
stu_obj = models.Student()
stu_obj.name = '关羽'
stu_obj.subject_id = sub_obj.id
stu_obj.save()
sub_obj = models.Subject.objects.get(name='java')
ret = models.Student.objects.create(
name='孙尚香',
subject = sub_obj
sub_obj = models.Subject.objects.get(name='java')
sub_obj.student_set.create(
name='奥莱',
models.Student.objects.get(name="阿毛").delete()
名字带大的删除
models.Student.objects.filter(name__contains="大").delete()
删除学科java
删除学科java,与学科关联的学生也会被删除掉
models.Subject.objects.get(name='java').delete()
zs转到java班
sub_obj = models.Subject.objects.get(name='java')
stu_obj = models.Student.objects.get(name='zs')
stu_obj.subject=sub_obj
stu_obj.save()
zs转到java班
sub_obj = models.Subject.objects.get(name='java')
models.Student.objects.filter(name='zs').update(subject=sub_obj)
zs和ls都转到java班
sub_obj = models.Subject.objects.get(name="java")
stu_obj1 = models.Student.objects.get(name='zs')
stu_obj2 = models.Student.objects.get(name='ls')
sub_obj.student_set.set([stu_obj1,stu_obj2])
一对多关系models.py中的模型类如下学科模型类如下:class Subject(models.Model): id = models.AutoField(primary_key=True) name = models. CharField(max_length=32) price = models.IntegerField() def ...
不管是哪种方法,都能完成你需要的操作,只不过方式不同。根据自己的需要选择一种就行了。
第一种:自带的ManyToManyField
django会帮你在数据库自动生成一个老师和班级的关系表,但不显示在models.py里面,所以不能直接操作关系表,但是可以间接操作。
不足之处:关系表只能有三个字段,比如我想在关系表中添加一个上课时间的字段,那么就不能用此方法。
class teacher(models.Model):
t_name = models.CharField(max_length=20,default=0)
tea_cla = models.ManyToManyF
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=16)
password = models.CharField(max_length=16)
clas...
from django.shortcuts import render # 导入显示页面的模块
from django.http import HttpResponse # 导入显示字符串的模块
from .mo...
假设有两张表—— Category 和 Goods 。如果一种类别下有多种货物,而每种货物只属于一种类别,这两张表就构成了一对多关联关系。下文主要介绍其 Model 层搭建和增删改查操作。
一、Model 类创建
class Category(models.Model): # 主表
title = models.CharField(max_length=20)
note = mo...
有的人建立外键,可能会报错,因为建立的类顺序有问题(ForeignKey括号里面没有加引号才会有这种问题)!
上图中,Book里面的publish作为外键,如果ForeignKey里面没有加引号,当然可以,但是publish作为外键,如果放到了 Book 的前面,就会报错!所以如果加了引号,就没有顺序问题。
a、方式一
举个例子,书与出版社,一般来说书只有一个出版社,但是一个出版社