• django 一对多的添加记录create 和save 方法,update 更新和save()方法的区别,查询API的方法


    转发之https://www.cnblogs.com/gyh04541/p/7910004.html

    查询api的方法:

    表.objects.all() ---[obj1,obj2,....]

    表.objects.all().first()

    表.objects.filter(id=2) ---[obj1,]  ,得到一个集合对象,集合里只有一个,跟上first()或者【0】取到一个具体对象

    表.objects.get(id=2)---obj,得到一个单独的对象,确定能找到,可以用,如果找到多个或者没有的,都报错。

     QuerySet.first(),与get()方法一样,都得到一个对象

    QuerySet.last(),与get()方法一样,都得到一个对象

    ----update 和save方法区别

    Book.objects.filter(id=5).update(price=1000)  #直接更新update 是QuerySet集合对象的方法,推荐

    save方法

    book = Book.objects.get(id=5)

    book.price=400

    book.save()

    ------value方法,

    values(*field),得到一个可迭代的字典序列,不再是一个个对象,而是对象的值,#得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值

    def query_value(request):
    
        b1 = Book.objects.values('title')#title值字段
        # print(b1)  #得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值,
        #< QuerySet[{'title': 'Linux'}, {'title': '项塔兰'}, {'title': '追风筝的人'}, {'title': '富爸爸'}] >
    
        b2 = Book.objects.values('title','price')#可以加多个字段
        print(b2)
        #< QuerySet[{'title': 'Linux', 'price': Decimal('30.00')},
        # {'title': '项塔兰', 'price': Decimal('45.00')},
        # {'title': '追风筝的人', 'price': Decimal('39.90')},
        #  {'title': '富爸爸', 'price': Decimal('23.00')}] >
    
    
    
        b3 = Book.objects.filter(id__gt=4).values('title')#查询id大于4,的title,得到一个对象集合,显示书名
        #<QuerySet [{'title': '富爸爸'}]>
        print(b3)
    
        return HttpResponse('value 方法的查询方法')

    ---

    value_list ( )  得到一个元组格式的数据,只有字段的值,

     # ----valuelist 方法查询  ,得到一个元组格式数据,只有字段的值,
        b4 = Book.objects.filter(id__gt=3).values_list('title')
        print(b4)   
        #<QuerySet [('追风筝的人',), ('富爸爸',)]>

    exclude()方法,

        b5 = Book.objects.exclude(id__gt=3)#exclude  排除 ,查询id大于4的以外的书籍,<QuerySet [<Book: Linux>, <Book: 项塔兰>]>
    
        b6 = Book.objects.filter(id__lt=4)# 查询id小于4 的书籍 <QuerySet [<Book: Linux>, <Book: 项塔兰>]>
    
        print(b5)
        print(b6)  #b5 和b6 得到结果一样,

    ----

    其他查询方法

    #  <6>order_by(*field):      对查询结果排序
    
    #  <7>reverse():             对查询结果反向排序,---需要先排序order_by(*field),才能反转
    
    #  <8>distinct():            从返回结果中剔除重复纪录
    
    #  <9>values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    
    #  <10>count():              返回数据库中匹配查询(QuerySet)的对象数量。
    
    #  <11>first():               返回第一条记录
    
    #  <12>last():                返回最后一条记录
    
    #  <13>exists():             如果QuerySet包含数据,就返回True,否则返回False   ---只判断是否有记录

    万能的双下划线:

    #---------------了不起的双下划线(__)之单表条件查询----------------

    # models.Tb1.objects.filter(id__lt=10, id__gt=1)  # 获取id大于1 且 小于10的值 #

    # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据

    # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in #  exclude  不包含指定的数据

    # models.Tb1.objects.filter(name__contains="ven")  #包含的内容

    # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感

    # # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and #

    # startswith,istartswith, endswith, iendswith,

    在url文件中匹配路由和视图函数add

    #mysql 拷贝是不能用,有配置信息,
    #是要需要修改配置
    
    from gu_orm import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^add/$',views.add),
    ]

    添加一条记录有2种方法

    create方法有2种,save方法

    create方法1 :给一对多的关系表中添加数据 ,写死,直接对应数据库的字段添加,是一组组键值对

    先给PUblish表添加记录,手动添加,点击 --减号右边  DB 就可以保存,

    注意:PUblish表要在book表上面,因为生成表的时候,book表有PUblish_id的字段,所以会先找到PUblish表,然后在book中添加对应的id号,要不报错

    在model里创建表,

    book与PUblish是一对多的关系,一个出版社可以出版多种书,外键就要建在多的表中,

    from django.db import models

    # Create your models here.
    class Publish(models.Model):

        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)


    class Book(models.Model):

        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5 , decimal_places=2)

        #书籍与出版社是一对多,书是多,出版社是一,外键(子表)建在多的表中,
        #publish 作为一个外键 与Book 表建立一对多关系,默认绑定到Book 的主键id上
        publish = models.ForeignKey(Publish,)

    #一对多的增删改查,

    #做增加
    #先给一 的表添加数据,才能在对应的多 的表增加数据,要不Publish_id 没有值,

    from django.db import models
    
    # Create your models here.
    class Publish(models.Model):
    
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
    
    
    class Book(models.Model):
    
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5 , decimal_places=2)
    
        #书籍与出版社是一对多,书是多,出版社是一,外键(子表)建在多的表中,
        #publish 作为一个外键 与Book 表建立一对多关系,默认绑定到Book 的主键id上
        publish = models.ForeignKey(Publish,)
    
    #一对多的增删改查,
    
    #做增加
    #先给一 的表添加数据,才能在对应的多 的表增加数据,要不Publish_id 没有值,

    在views文件中

    先导入从model 已经创键的表Book表,  给book表增加数据,

    Book.objects.cteate(),用create方法创建表,

    数据库的字段对应要添加值,然后运行项目,

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    from gu_orm.models import *   -----从models表中导入所有的表,
    
    def add(request):
    
        #添加一条book记录
        Book.objects.create(     
    
            title = '千城之城',
            price = 11.90,
            publish_id = 1#以数据库的字段为准,
        )
    
        return HttpResponse('ok')

    此时就可以看到数据库book表中就有了一条记录,并且对应着一条PUblish的记录

     =====

    获取对象的具体值,单个对象字段属性

    #从数据库获取一条记录,
        book_obj = Book.objects.get(id=1)
        print(book_obj.title)
        print(book_obj.price)

    运行项目,得到结果,,,

    千城之城
    11.90

    现在打印book表中一个外键的字段PUblish

    print(book_obj.publish)   ------Publish object  得到一个对象,是PUblish表中的一条记录,对应书中的一条记录,,是一个对象,因为是一对多的关系

    要想显示外键的具体的值,就在PUblish表加上__str__(self):,就会显示具体的值,而不再是对象

    如下,

    class Publish(models.Model):
    
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=32)
    
        #有了__str__()方法,就可以看到对象具体的值,没有它 ,打印对象,就是一个对象,
        # 当用到PUblish表中字段的时候,
        # 就可以看到对象具体的值,而不再是一个看不懂的对象,
        def __str__(self):
    
            return self.name

    此时再打印book表的外键,

     #打印外键字段publish
        print(book_obj.publish)   ---北京出版社
    
        #Publish object 得到一个对象,是 publsih表中对应的一条记录也就是一个对象,
        #看不到具体的值,想看到对象具体的值,就用 __str__()方法,所以在models里
        #就可以用__str__(),就可以看到外键的具体值,而不再是一个对象,

    ---所以在每个表中,都可以使用__str__(self)方法,显示对象的具体的值

    要想显示多个值也可以,用+ 号,记得空开距离

     def __str__(self):

            return self.name +" "+self.addr

    create方法2 :给一对多的关系表中添加数据

    先创建一个PUblish对象

     #方法2,先找到一个出版社对象
        publish_obj = Publish.objects.get(id=2)

    然后再用create方法,把publish_obj对象给publish表

    复制代码
     #创建book对象,
        Book.objects.create(
            title = '项塔兰',
            price = 23.50,
            publish = publish_obj,
        )
    复制代码

    运行程序,重新访问视图函数add,url地址栏重新访问add,数据库就了新添加的记录

     添加记录方法2,

    =====save方法

    #save 方法,用实例出来的对象保存
        # 一对多,
        p = Publish(name='人民出版社',addr='昌平')

        p.save()#把对象保存到数据库

        #与PUblish表添加一个对象,既一条记录
        book = Book(title = '追风筝的孩子',price = '15.00',publish = p)
        #与PUblish的publish_id绑定一个存在的记录,既对象
        book = Book(title = '追风筝的孩子',price = '15.00',publish_id = 3)

        book.save()  #保存到数据库

     
  • 相关阅读:
    Django——不同版本
    04爬取拉勾网Python岗位分析报告
    24 两两交换链表中的节点
    UniGUI学习之UniImage(39)
    Delphi7开发简单文件传输
    Javaday03(补充day02运算符,流程控制)
    java中代码块,构造方法和普通方法的代码执行顺序
    +=隐式类型转换
    关于switch中的default
    Java操作JSON数据(5)--jettison操作JSON数据
  • 原文地址:https://www.cnblogs.com/weigege2015/p/8707660.html
Copyright © 2020-2023  润新知