zoukankan      html  css  js  c++  java
  • ORM 一对一 以及csrf 的简单用法

    ORM 一对一

    1. 什么时候用一对一?

    当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁
    把不怎么常用的字段 单独拿出来做成一张表 然后用过一对一关联起来

    2. 优势
    既保证数据都完整的保存下来,又能保证大部分的检索更快

    3. ORM中的用法

    class Author(models.Model):
    name = models.CharField(max_length=16, unique=True)
    books = models.ManyToManyField(to='Book')
    a_info = models.OneToOneField(to='Author_info')


    class Author_Info(models.Model):
    hobby = models.CharField(max_length=30)
    addr = models.CharField(max_length=128)

    ORM 多对多的三种方式

     

    多对多的方式:
    1. ORM自动帮我创建第三张表
     

    class Book(models.Model):
    title = models.CharField(max_length=30, unique=True)
    salary = models.IntegerField(default=50)
    publisher = models.ForeignKey(to='Publisher')
    kucun = models.IntegerField(default=1000)
    maichu = models.IntegerField(default=500)


    class Author(models.Model):
    name = models.CharField(max_length=16, unique=True)
    books = models.ManyToManyField(to='Book')



    2. 自己创建第三张表, 利用外键分别关联作者和书
    关联查询比较麻烦,因为没办法使用ORM提供的便利方法

        class Author2Book(models.Model):

          author = models.ForeignKey(to="Author")

          book = models.ForeignKey(to='Book")

          class Meta:

            unique_together = ("author", "book")

        


    3. 自己创建第三张表,使用ORM 的ManyToManyFiled()
    使用此种方式创建多对多表的时候,没有 add() remove() 等方法

      class Author(models.Model):

        name = models.CharField(max_length=32)

        age = models.IntegerField()

        phone = models.IntegerField()

        # 通过through,through_fields来指定使用我创建的第三张表来构建多对多的关系

        books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book",))

        # 第一个字段: 多对多设置在哪一张表里, 第三张表通过什么字段找到这张表 就把这个字段写在前面

        detail = models.OneToOneField(to="AuthorDetail")

      

     

    我们应该用哪种?
    看情况:
    1. 如果你第三张表没有额外的字段,就用第一种
    2. 如果你第三张表有额外的字段,就用第三种或第一种
    例子:

    相亲网站:
    Boy
    girls = ManyToManyField(to=“Girl")

    Girl

    约会记录:多对多
    id boy_id girl_id date

    
    

    csrf简单用法


    什么是CSRF ?

    跨站请求伪造,

    问题:

    1. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的?)

    钓鱼网站的页面是由 钓鱼网站的服务端给你返回的

    正经网站的网页是由 正经网站的服务端给你返回的

     

    2. Django中内置了一个专门处理csrf问题的中间件

    django.middleware.csrf.CsrfViewMiddleware



    这个中间件做的事情:

     

    1. 在render返回页面的时候,在页面中塞了一个隐藏的input标签

    用法:
    我们在页面上 form表单 里面 写上 {% csrf_token %}

    <input type="hidden" name="csrfmiddlewaretoken" value="8gthvLKulM7pqulNl2q3u46v1oEbKG7BSwg6qsHBv4zf0zj0UcbQmpbAdijqyhfE">

    2. 当你提交POST数据的时候,它帮你做校验,

    多表查询

      块一张表查询

    ret = models.Book.objects.filter(title__contains='红楼梦').values_list('author__name')


    跨多张表查询


    ret = models.Author.objects.filter(name='匿名').values('books__publisher__name')

     

  • 相关阅读:
    Ynoi2016 这是我自己的发明
    Luogu P5268 [SNOI2017]一个简单的询问
    Ynoi2017 由乃的玉米田
    BZOJ4320 [Shanghai2006]Homework
    JOISC2014C 歴史の研究
    莫队
    LOJ6119 「2017 山东二轮集训 Day7」国王
    Luogu P3295 [SCOI2016]萌萌哒
    10.1 进程间通信--消息队列
    9.2 网络协议理论
  • 原文地址:https://www.cnblogs.com/xuerh/p/9038509.html
Copyright © 2011-2022 走看看