zoukankan      html  css  js  c++  java
  • ORM基础5

    一、一对一

    场景:字段多,且一部分字段使用率高

    优点:提高效率

    实质:唯一的外键

    # Person表
    class Person(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=16, null=False, unique=True)
        sex = models.CharField(max_length=8, null=False)
        # Django2.0 要添加on_delete
        details = models.OneToOneField(to="PersonDetails", on_delete=models.CASCADE)
    
    
    # PersonDetails
    class PersonDetails(models.Model):
        hobby = models.CharField(max_length=32, null=False)
        addr = models.CharField(max_length=64, null=False)
        # 正向QuerySet查找 字段
        ret = models.Person.objects.filter(id=1).values_list('details__hobby')
        print(ret)
        # 反向QueerySet查找 表名
        ret = models.PersonDetails.objects.filter(addr="徐州").values("person__name")
        print(ret)

    二、多对多创建的方式

    1、ManyToManyField,自动创建第三张表

    优点:简单、方便

    缺点:不能在第三张表添加额外的字段

    2、自己创建第三张表,利用外键分别关联

    缺点:麻烦、并且不能使用ORM的内置方法,所有一般不用这种方法

    3、ManyToManyField,指定第三张表

    优点:查询方便,第三张表可以自定义字段

    缺点:第三张表自定义字段后,无法使用create、add、set等方法,需要通过第三张表直接操作

    #
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=16, null=False, unique=True)
        price = models.DecimalField(max_digits=4, decimal_places=2)
    
    
    # 作者
    class Author(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=8, null=False, unique=True)
        books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    
    
    # 作者to书
    class Author2Book(models.Model):
        id = models.AutoField(primary_key=True)
        author = models.ForeignKey(to="Author", on_delete=models.CASCADE)
        book = models.ForeignKey(to="Book", on_delete=models.CASCADE)
        data = models.DateField(auto_now_add=True)
    
        class Meta:
            # 作者和书设置联和唯一
            unique_together = ("author", "book")
        # 正向QuerySet查询 字段
        ret = models.Author.objects.filter(id__gt=1).values("books__title", "books__price")
        print(ret)
        print('去重'.center(80, '-'))
        print(ret.distinct())
        # 反向SquerySet查询 表名
        ret = models.Book.objects.filter(id=1).values_list("author__name")
        print(ret)

    三、csrf的简单用法(POST请求)

    csrf (Cross-site request forgery)跨站请求伪造

    实质:添加一个动态隐藏标签,提交的时候网站要做比较

    在form表单中添加:

    {% csrf_token %}
    return render(request, "real.html")
    request, 每次返回一个新值 去改变csrf_token

     四、补充

    1、select_related()
        # 用于一对一,多对一
        # 提高效率
    2、prefetch_related()
        # 用于多对多
        # 提高效率
    3、bulk_create()
        # 批量创建
  • 相关阅读:
    Qt实战6.万能的无边框窗口(FramelessWindow)
    Qt实战5.如何获取USB设备信息?
    Qt实战4.简单封装的文件监控
    Qt实战3.Qt仿Win10风格界面
    Linux下使用脚本让程序顺序启动
    项目经验1.软件的开发过程
    Qt实战2.老生常谈的文件传输
    mysql导入txt文件
    linux离线安装python3
    mysql知识点
  • 原文地址:https://www.cnblogs.com/wt7018/p/11273369.html
Copyright © 2011-2022 走看看