美文网首页
day09-模型

day09-模型

作者: wenyilab | 来源:发表于2020-01-30 18:06 被阅读0次

    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'
    

    相关文章

      网友评论

          本文标题:day09-模型

          本文链接:https://www.haomeiwen.com/subject/xzlithtx.html