day09-模型

2020-01-30  本文已影响0人  wenyilab

1、模型关系
1)一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多类中
2)多对多关系
例:新闻类-新闻类型类 体育新闻 国际xinw
models.ManytoManyField() 定义在哪个类中都可以

# 新闻类型类
class NewsType(models.Model):
    # 类型名
    type_name = models.CharField(max_length=20)
    # 关系属性
    type_news = models.ManyToManyField('NewsInfo')

class NewsInfo(models.Model):
    # 新闻标题
    title = models.CharField(max_length=128)
    # 发布时间
    pub_date = models.DateTimeField(auto_now_add=True)
    # 信息内容
    content = models.TextField()
    # 关系属性
    # news_type = models.ManyToManyField('NewsType')

3)一对一关系
例:员工基本信息类-员工详细信息类,员工工号
models.OnetoOneField 定义在哪个类中都可以


# 员工基本信息类
class EmployeeBasicInfo(models.Model):
    # 姓名
    name = models.CharField(max_length=20)
    # 性别
    gender = models.BooleanField(default=False)
    # 年龄
    age = models.IntegerField()
    # 关系属性,代表员工的详细信息
    employee_detail = models.OneToOneField('EmployeeDetailInfo')

# 员工详细信息类
class EmployeeDetailInfo(models.Model):
    # 联系地址
    addr = models.CharField(max_length=256)
    # 教育经历
    # 关系属性,代表员工的基本信息
    employee_basic = models.OneToOneField('EmployeeBasicInfo')

2、关联查询(一对多)
例:查询图书id为1的所有英雄信息

b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()

通过模型类查询:

HeroInfo.objects.filter(hbook__id=1)

例:查询id为1的英雄的图书信息

h = HeroInfo.objects.get(id=1)
h.hbook

通过模型类查询:

BookInfo.objects.filter(heroinfo__id=1)

通过模型类实现关联查询
例:查询图书信息,要求图书中英雄的描述包含‘八’

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查询图书信息,要求图书中的英雄id大于3

BookInfo.object.filter(heroinfo__id__gt=3)

例:查询书名为“天龙八部”的所有英雄

HeroInfo.objects.filter(hbook__btitle='天龙八部')

注意:
通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
写关联查询条件的时候,如果类中没有关系属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性。

3、插入与删除
调用模型对象save方法时就可以完成插入与更新
调用模型对象delete方法时就可以完成删除
4、自关联
自关联是一种特殊的一对多关系
案例:显示广州市的上级地区和下级地区
地区表:id,title,parentid;
mysql终端批量执行sql语句:source areas.sql;

视图函数

def areas(request):
    '''获取广州市的上级地区和下级地区'''
    # 1、获取广州市的信息
    area = AreaInfo.objects.get(atitle = '广州市')
    # 2、查询广州市的上级地区
    parent = area.aParent
    # 3、查询广州市的下级地区
    children = area.areainfo__set.all()
    # 4、使用模版
    return render(request,'booktest/areas.html',
                  {'area':area,'parent':parent,'children':children})

urls

urlpatterns = [
    url(r'^index/$',views.index),
    url(r'^create/$',views.create),
    url(r'^delete(\d+)$',views.delete),
    url(r'^areas$',views.areas),
]

模版文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自关联案例</title>
</head>
<body>
<h1>当前地区</h1>
{{ area.atitle }}<br/>
<h1>父级地区</h1>
{{ parent.atitle }}<br/>
<h1>下级地区</h1>
<ul>
    {% for child in children %}
        <li>{{ child.atitle }}</li>
    {% endfor %}
</ul>
</body>
</html>

5、模型管理器
objects是Django自动生成的models.Manager类对象,自定义管理器之后就不会再生成objects对象。

objects = models.Manager()
objects = BookInfoManager() # 自定义模型管理器

代码
1)改变查询的结果集
2)封装函数:操作模型类对应的数据表(增删改查)


class BookInfoManager(models.Manager):
    '''图书模型管理类对象'''
    # 1、改变查询的结果集
    def all(self):
        # 1、调用父类all,获取所有
        books = super().all()
        # 2、对数据进行过滤
        books = books.filter(isDelete=False)
        # 3、返回books
        return books
    # 2、封装函数:操作模型类对应的数据表(增删改查)
    def create_book(self,btitle,bpub_date):
        # 1、创建一个图书对象
        # 使用self.model可以创建跟自定义管理器对象对应模型类对象
        model_class = self.model
        book = model_class()
        book.btitle = btitle
        book.bpub_date = bpub_date
        # 2、保存对象
        book.save()
        # 3、返回对象
        return book

6、元选项
很重要
指定模型类对应的表名

    class Meta:
        db_table = 'bookinfo'
上一篇下一篇

猜你喜欢

热点阅读