django中model的对应关系

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默认是开启了级联删除的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值