模型类的对应关系
多对多
创建模型类----->新闻类型类
class TypeInfo(models.Model):
"""创建新闻模型类"""
tname = models.CharField(max_length=20)
创建模型类----->新闻内容类
class NewInfo(models.Model):
"""闯将新闻内容类"""
ntitle = models.CharField(max_length=20)
npub_date = models.DateTimeField(auto_now_add=True)
ncontent = models.FileField()
# 建立多对多的关系
ntype = models.ManyToManyField("TypeInfo")
总结:
更新语句
Models.objects.fileter().update(**info) # 返回更新的条数 Models.objects.all().update(**info)
Models.objects.fileter(条件).delete() # 返回删除信息
一对多
总结(一)当中图书和英雄的案例则为一对多的关系
创建语句写在多的模型类当中
hbook = models.ForeignKey("BookInfo")
总结:
创建表后关联字段名称为----关联属性_id
一对一
class Student(models.Model):
"""建立学生基本信息模型类"""
sname = models.CharField(max_length=20)
sage = models.IntegerField()
class StuInfo(models.Model):
"""简历学生的详细信息类一对一的关系"""
scontent = models.CharField(max_length=200)
stu = models.OneToOneField("Student")
总结:
创建语句写在哪一个模型类当中都可以
自关联

描述:
自关联是一种特殊的一对多的关系。
例:显示广州市的上级地区和下级地区。
地区表:id, title, parent
class AreaInfo(models.Model):
"""创建地区模型类"""
atitle = models.CharField(max_length=20)
aparent = models.ForeignKey("self", null=True, blank=True)
导入数据信息
注意:导入数据时需要从areas.sql的当前所在文件夹进入数据库
mysql终端中批量执行sql语句:
source areas.sql;
案例:
def area(request):
"""地区示例"""
# 1.获取当前那的地区
# 2.id为440100的市为哪个省的
# 3.id为440100的市里面有那些区
area = AreaInfo.objects.get(id=440100)
方法一:
parent = area.aparent
children = area.areainfo_set.all()
方法二:
parent = AreaInfo.objects.filter(areainfo__id=440100)
children = AreaInfo.objects.filter(aparent__id=440100)
return render(request, "booktest/area.html", {"area": area, "parent": parent, "children": children})
模型管理器:
BookInfo.objects.all()->objects是一个什么东西呢?
答:objects是Django帮我自动生成的管理器,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
自定义模型管理器:
自定义管理器类的应用场景:
管理器类中定义一个方法帮我们创建对应的模型类对象。
使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。
例:
class BookInfoManage(models.Manager):
"""继承模型管理器类"""
def all(self):
# 调用父类的__init__方法1(python2)
# Cat.__init__(self,name)
# 调用父类的__init__方法2
# super(Bosi,self).__init__(name)
# 调用父类的__init__方法3---->此方法为python3的方法
# super().__init__(name)
# books = models.Manager.all(self)
# books = super(models.Manager, self).all()
# books = super().all(self)
books = super(models.Manager, self).all()
books = books.filter(isDelete=0)
return books
def create_book(self, btitle, bpub_date):
"""自定义添加数据的方法"""
b = BookInfo()
# 方法二:此方法的优点,当模型的类名修改时不需要随之修改名字
# b = self.model()
b.btitle = btitle
b.bpub_date = bpub_date
b.bread = 0
b.bcomment = 0
b.save()
自定义模型管理器的好处
元选项
django默认生成的表名为 应用的名字_模型类的类名可以通过元选项的操作给表指定表名
需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
例:
class Meta():
"""自定一表名"""
db_table = "bookinfo"
# 注意是定义在模型类的里面
查询集:
返回查询集的过滤器如下:
返回单个值的过滤器如下:
查询集的两大特性:
限制查询集:
模型类属性
属性命名限制:
格式:
属性=models.字段类型(选项)
使用时需要引入django.db.models包,字段类型如下:
goods_type_id = models.SmallIntegerField(choices=goods_type_choice)
选项:
class Meta():
abstract = True # 抽象模型类
goods_type_id = models.SmallIntegerField(choices=goods_type_choice)
原文:https://www.cnblogs.com/lovecong/p/9357348.html