one2one:model数据字段,最重要的就是设置外键 这个
# 联系人作为主表
class PersonModel(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
phone = models.CharField(max_length=15, verbose_name='手机号')
class Meta:
db_table = 'person'
class AccountModel(models.Model):
# 一个账户对应一个联系人
# models.CASCADE,当主表中的数据被删除时,从表数据一块删除
~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
person = models.OneToOneField(PersonModel, on_delete=models.CASCADE)【在这列设置的外键,外间的关键词OneToOneField】
~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
username = models.CharField(max_length=20, verbose_name='用户名')
address = models.CharField(max_length=50, verbose_name='地址')
class Meta:
db_table = 'account'
one2one:添加!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
创建models中的数据类的对象
主表:
person = PersonModel()
person.name = ‘赋予的值’
person.phone = ‘赋予的值’
person.save()
从表:
account = AccountModel()
account.person = person[这里的’acount.person‘(这里的person就是model从表中设置的外键)属性对应的就是主表的一个对象]
account.username = 'www'
account.address = 'wwwww'
account.save()
one2one:查询!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
person = PersonModel.objects.get(id=3)
account = person.accountmodel(是根据person在AccountModel中对应的一条数据)
以上写法等同于这个:account = AccountModel.objects.get(person=person)
某个属性的值就是 account.username account.address
account = AccountModel.objects.get(id=2) 找到account对象
某个属性的值就是 account.username account.address
知道某张表中的某个条件,查询另外一张表中的所有数据
# person = PersonModel.objects.get(name='www')
# print(person.accountmodel.username)
# print(person.accountmodel.address)
person__name利用person表中name字段,查询account表中的数据
account = AccountModel.objects.get(person__phone='110')
print(account.username)
{person = PersonModel.objects.get(accountmodel__username='qq')
print(person.phone)
}这个accountmodel是大写还是小写
one2one:删除
主表中的数据被删除后,从表数据一并删除
PersonModel.objects.get(id=2).delete()
account = AccountModel.objects.get(id=4)
修改从中的person属性值,person值必须是person表中的一条没有被关联的数据
# account.person =
one2many
# 一对多
# 一个老师 对应多个学生
# 一个班级 对应多个学生
# 一个用户 对应多个收货地址
class ClassRoom(models.Model):
class_name = models.CharField(max_length=20, verbose_name='教室名称')
class_addr = models.CharField(max_length=20, verbose_name='教室地址')
class Teacher(models.Model):
name = models.CharField(max_length=20, verbose_name='教师名称')
class Student(models.Model):
#### ######## ForeignKey 设置外键
class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
# ############可以设置多个外键
teacther = models.ForeignKey(Teacher, on_delete=models.CASCADE)
name = models.CharField(max_length=10, verbose_name='学生姓名')
phone = models.CharField(max_length=20, verbose_name='学生电话')
添加还是创建对象,对象点属性等于一个值,然后就是对象点save()
class_room = ClassRoom()
class_room.class_name = 'python12'
class_room.class_addr = '315'
class_room.save()
找到ClassRoom表格id=6的对象
class_room = ClassRoom.objects.get(id=6)
stu = Student()
stu.class_room = class_room【这个class_room 就是 ClassRoom.objects.get(id=6),也就是ClassRoom的一个对象,stu.class_room这个是 Student()的一个属性 stu是Student()对象 】
【一对多的,多的那个类(Student)的对象(stu )中的,属性就是一的对象(class_room = ClassRoom.objects.get(id=6))这个属性就是在model中设置外间的那个属性】
stu.name = 'ssss'
stu.phone = '1110'
stu.save()
one2many 查询
class_room = ClassRoom.objects.get(id=6)
class_room.class_name, class_room.class_addr
2.根据主表数据查询从表数据
student_set从表中的数据集合{这个从表中的数据集合是什么意思 ????????????????}
stus = class_room.student_set.all()
stus = Student.objects.filter(class_room = class_room)
# 3.根据从表数据查询主表数据
# stu = Student.objects.get(name='lisi')
#### ##### class_room ,就是主表中对应的数据模型对象
# print(stu.class_room.class_name)
class_room = ClassRoom.objects.get(student__name__contains='lisi')
print(class_room.class_name)
# 删除主表中的数据,从表中关联的数据一并删除
# ClassRoom.objects.get(id=6).delete()
# 删除从表中的数据
# Student.objects.get(id=1).delete()
return HttpResponse('delete ok')
# 学徒
# 新闻出版社 文章
# 一个出版社对应多篇文章
# 一篇文章对应多个出版社
class Publication(models.Model):
name = models.CharField(max_length=20, verbose_name='出版社')
addr = models.CharField(max_length=20, verbose_name='地址')
class Meta:
db_table = 'publication'
class Article(models.Model):
title = models.CharField(max_length=50, verbose_name='标题')
author = models.CharField(max_length=50, verbose_name='作者')
content = models.CharField(max_length=50, verbose_name='内容')
# ManyToManyField 多对多
pub = models.ManyToManyField(Publication ,verbose_name='出版社')
class Meta:
db_table = 'article'
# pub = Publication()
# # pub.name = 'qqqqqq'
# # pub.addr = '北京'
# # pub.save()
#
# article = Article()
# article.title = '3寻找!'
# article.author = '凤凰'
# article.content = '寻找!'
# article.save()
{
pub = Publication.objects.get(id=1)
# pub2 = Publication.objects.get(id=2)
# article2 = Article.objects.get(id=2)
# article3 = Article.objects.get(id=3)
不管是一对一还是一对多,从表对象.关系字段 = 主表数据对象
多对多关系
# article.pub 是一个数据集合
article.pub.all()
article2.pub = {pub}
# article2.save()
# article3.pub = {pub}
# article3.save()
# print(article.pub.all())
article = Article.objects.get(id=1)
pub = Publication.objects.get(id=2)
# article.pub.add(pub)
article.pub = {1, 2, 3}
# article.pub.add(3)
article.save()
{这里的没有了理解 # article.pub 是一个数据集合 }
}
# 1.删除表数据之间的关联
# 2.删除表中的数据
# Publication.objects.get(id=1).delete()
# 1.删除表数据之间的关联
# 2.删除表中的数据
Article.objects.get(id=1).delete()
pub = Publication.objects.get(id=1)
# 获取主表对应的所有从表数据
# article_set数据集合
# print(pub.article_set.all())
article = Article.objects.get(id=1)
# 获取从表对应主表信息
# article.pub 数据集合
print(article.pub.all())
url中的参数 第一个 正则表达式 路由 第二个就是
视图函数 第三个name 就是反向解析名前台{% url ‘name’%}