• django orm 重点大全


    1.最简单的跨表,查询外键表中符合主表条件的记录列表

    #用户类型表
    class User_typ(models.Model):
        name=models.CharField(max_length=32)
     
    #用户表
    class User(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField(max(100))
        type=models.ForeignKey(User_typ)
    
    
    #查询用户表里所有记录(对象列表)
    obj_list=User.objects.all()
    
    #查询用户表里某一列字段的所有记录(对象列表)
    obj_field_list=User.objects.all().values('name')
    
    #跨表
    #查询用户表中,用户类型为 普通用户(用户类型表中有一条记录为‘普通用户’) 的所有记录(对象列表)
    obj=User.objects.filter(type__name='普通用户')
    View Code

    2.最简单的多表联查,查询外键表中符合主表的主表的条件的记录列表

    #主表aa
    class aa(models.Model):
          a=models.CharField(max_length=32)
    
    #外键表bb,同时也是cc的主表
    class bb(models.Model):
        b=models.CharField(max_length=32)
        b1=models.ForeignKey(User_typ)
    
    #外键表cc
    class cc(models.Model):
        c=models.CharField(max_length=32)
        c1=models.ForeignKey(User_typ)
    
    #cc表中符合aa表中a==‘xx’的记录列表
    obj_list=cc.objects.filter(c1__b1__a='xx')
    View Code

     3.书、出版社、作者,三者之间互相查来查去

    1.建立这四个表

    #一对一    OneToOne(表名)
    #一对多    ForeignKey(表名)
    #多对多    ManyToMany(表名)
    
    #建立书表
    class Book(models.Model):
        title = models.CharField(max_length=32)
        publishDdata = models.DateField()  # 出版日期
        price = models.DecimalField(max_digits=5, decimal_places=2)  # 一共5位,保留两位小数
        publish = models.ForeignKey("Publish")  #foreignkey(表名)建立的一对多关系
        authorlist = models.ManyToManyField("Author")  #建立的多对多的关系    
        def __str__(self):  #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥
            return self.title
    
    #建立出版社表
    class Publish(models.Model):
        name =models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
    
        def __str__(self):
            return self.name
    
    #建立作者表
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
    
    
    #建立作者详细信息表
    class AuthorDeital(models.Model):
        tel = models.IntegerField()
        addr = models.CharField(max_length=32)
        author = models.OneToOneField("Author")  #建立的一对一的关系

    2.orm字段必须要知道的一些属性

    (0)null
    
    如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
    
    (1)blank
    
    如果为True,该字段允许不填。默认为False。
    要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
    如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
    
    (2)default
    
    字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
    
    (3)primary_key
    
    如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
    Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
    否则没必要设置任何一个字段的primary_key=True。
    
    (4)unique
    
    如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
    
    (5)choices
    由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,
    默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
    
    这是一个关于 choices 列表的例子:
    
    YEAR_IN_SCHOOL_CHOICES = (
        (‘FR‘, ‘Freshman‘),
        (‘SO‘, ‘Sophomore‘),
        (‘JR‘, ‘Junior‘),
        (‘SR‘, ‘Senior‘),
        (‘GR‘, ‘Graduate‘),
    )
    每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 
    在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:
    
    from django.db import models
    
    class Person(models.Model):
        SHIRT_SIZES = (
            (‘S‘, ‘Small‘),
            (‘M‘, ‘Medium‘),
            (‘L‘, ‘Large‘),
        )
        name = models.CharField(max_length=60)
        shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
    
    
    >>> p = Person(name="Fred Flintstone", shirt_size="L")
    >>> p.save()
    >>> p.shirt_size
    ‘L‘
    >>> p.get_shirt_size_display()
    ‘Large
    View Code

    3.orm添加记录,其实重要的是先查到,然后再添加就比较容易了,传说中的三种方式,貌似实际应用中只有save()的方式可以使用,原因无他,只有save()能触发django定义的一些钩子函数,留下数据更改的日志信息,比较安全。

    4.跨表查询一览图

    #一对一查询
    
    # 正向查询:手机号为13245的作者的姓名
    deital_obj = models.AuthorDeital.objects.filter(tel="13245").first()
    
    print(deital_obj.author.name)
    
    # 反向查询:查询作者韩寒的手机号
    author_obj = models.Author.objects.filter(name="韩寒").first()
    
    print(author_obj.authordeital.tel)
    
    #可以看出来,一对一就如同将两个表何为一个表,然后一个表起两个名字似的
    
    
    #一对多查询
    
    # 正向查询:查询《金鳞岂是池中物》的出版社的地址
    
    
    # 找到《金鳞岂是池中物》那一条记录对象
    book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0]
    
    print(book_obj.publish)  # 拿到的是关联出版社的对象 
    print(book_obj.publish.addr) #出版《金鳞岂是池中物》的那家出版社的地址
    
    
    
    # 反向查询:查询人民出版社出版过的所有的书的名字
    
    #找到叫‘人民出版社’的出版社记录(对象)
    pub_obj = models.Publish.objects.filter(name="人民出版社")[0]
    # 叫‘人民出版社出版’的出版社 出版的所有书的对象集合
    book_list=publish.book_set.all()
    #用for循环遍历查询出每本书的名字
    for book_obj in book_list:
          print(book_obj.title)
    
    
    
    
    #多对多查询记录
    
    # 正向查询:查询《金鳞岂是池中物》这本书的所有的作者的姓名和年龄
    book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0] #找到书的记录(对象)
    print(book_obj.authorlist.all().values("name", "age"))  # 这本书关联的所有作者对象的集合,注意这里又表现出了一对一的本质是二表合一的特性
    
    # 反向查询:查询作者‘兰陵笑笑生’ 出了哪几本书
    lan_obj = models.Author.objects.filter(name="兰陵笑笑生")[0]#找到作者的记录(对象)
    print(lan_obj.book_set.all())  # 与该作者关联的所有书对象的集合
  • 相关阅读:
    HDU 4666 Hyperspace【最远曼哈顿距离+优先队列】
    Set集合容器
    堆排序实现
    手机网站调试神器之chrome控制台
    CC Sereja and Ballons (主席树)
    Multiset多重集合容器
    ZOJ 3626 Treasure Hunt I
    hdu 2072
    poj 3498 (最大流,枚举汇点)
    排序算法--冒泡排序
  • 原文地址:https://www.cnblogs.com/xuepangzi/p/8946910.html
Copyright © 2020-2023  润新知