django模型
python manage.py makemigrations
python manage.py migrate
一、一对多
class A():
name=....
pass
class B():
ab=models.Foreignkey(A,related_name='bs')
A
graph LR
A(一)–>B(多)
一个A对应的所有B,则有a(对象).b(B的小写)_set.all()等价于则有a(对象).bs.all()
反之为a(对象).ab.name
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示(上面默认以b_set访问),默认返回的是一个querydict对象。related_name可以给这个外键定义好一别的名称
二、一对一
class One(models.Model):
oname = models.CharField(max_length=20, null=True)
oage = models.CharField(max_length=20, null=True)
odate = models.DateField(null=True)
class Two(models.Model): # 设置一对一关系,是通过将表中的字段设置为主键完成的# on_delete=models.CASCADE 当父表中的某一条数据删除的时候 # 相关字表中的数据也会被删除
tsub = models.OneToOneField(One, on_delete=models.CASCADE, primary_key=True)
tfond = models.CharField(max_length=20, null=True)
tdes = models.CharField(max_length=200, null=True)
o1 = One.objects.create(oname='张三',oage=11,odate='2011-11-11')
o2 = One.objects.create(oname='张三2',oage=12,odate='2012-12-12')
t1 = Two.objects.create(tsub=o1,tfond='o1',tdes='我喜欢o1')
t2 = Two.objects.create(tsub=o2,tfond='o2',tdes='我喜欢o2')
>>> Two.objects.get(tsub__oname = '张三').tfond
'o1'
正向查询(由学生表查询班级表)
stu = models.Student.objects.first()
stu.detail.email
反向查询(由学生详情表反向查询学生信息表)
detail = models.StudentDetail.objects.get(id=1)
detail.student.sname(这里的student也就是模型类的小写而已)
三、多对多
class Publication(models.Model):
pname = models.CharField(max_length=200)
paddress = models.CharField(max_length=200)
class Look(models.Model):
bname = models.CharField(max_length=200)
bauthor = models.CharField(max_length=200)
publications = models.ManyToManyField(Publication, related_name='looks')
# p1 = Publication(pname='大象出版社',paddress='河南',)
# p2 = Publication(pname='北京出版社',paddress='北京')
# p3 = Publication(pname='清华出版社',paddress='河北')
# p1.save()
# p2.save()
# p3.save()
#
# b1 = Book(bname='海底两万里',bauthor='赵四')
# b2 = Book(bname='遮天',bauthor='辰东')
# b3 = Book(bname='童年', bauthor='xxxx')
# b4 = Book(bname='在人间', bauthor='yyyy')
# b5 = Book(bname='我的大学', bauthor='张飞')
# b6 = Book(bname='汤姆索亚历险记', bauthor='赵六儿')
# b1.save()
# b2.save()
# b3.save()
# b4.save()
# b5.save()
# b6.save()
#
# b1.publication.add(p1,p2,p3)
# b2.publication.add(p1,p2)
# b3.publication.add(p1,p3)
# b4.publication.add(p2,p3)
# b5.publication.add(p3)
反查
>>> s=Look.objects.get(id=1).publications.all()
>>> for i in s:
... print(i.pname,i.paddress)
...
大象出版社 河南
北京出版社 北京
清华出版社 河北
>>>
顺查
>>> p=Publication.objects.get(pname='北京出版社').looks.all()
>>> for i in p:
... print(i.bname,i.bauthor)
...
F对象
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1
reporter.save()
from django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
两个程序的功能是为了计数(或减数)
例子1中的写法,应该是比较常见的。它的工作原理是,将对象从数据库中查出来放到内存中,然后计数,再存入到数据库中。
例子2中的工作原理是,直接在数据库中查出数据,计数后更改数据库。
逻辑运算之Q对象
Student.objects.filter(name='xiao ming',age=12)
我们要查询年龄12或者姓名叫小明的
from django.db.models import Q #引入
Student.objects.filter(Q(name='xiao ming')|Q(age=12))
aggregate这个函数来实现聚合功能
使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
例:查询所有学生的数目。select count(*) from student;
Student.objects.aggregate(Count('id'))
{'id__count': 5} 注意返回值类型及键名
例:查询所有学生年龄和。
Student.objects.aggregate(Sum(‘age’))
{‘age__sum’:120} 注意返回值类型及键名
技术总结
1.序列化器、自定义序列化器
2.信号、自定义信号(django)
1>信号使用的两种方式
i>@recover(信号,sender=信号发送者)
def 信号触发时相应的函数(**kwargs)
pass
ii>信号.connect(触发信号时的函数名,sender=信号发送者)
2>自定义信号(自定义信号时,需要用send来发送信号)
import django.dispatch
make_log = django.dispatch.Signal(providing_args=['a, 'b', 'c'])#自定义一个名叫make_log的信号,参数为a,b,c
3>多线程时,给线程取个名字的原因有,在打印调用栈时可以用来区分,也利用排bug
3.django默认是开启了级联删除的