单表操作

2.表单操作--添加数据

直接上代码

ORM/urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index)
]

app01/models.py

from django.db import models

# 利用类创建一个Book表 ,必须继承models.Model类
class Book(models.Model):
    id = models.AutoField(primary_key=True,unique=True)
    title = models.CharField(max_length=32)
    state = models.BooleanField()
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.CharField(max_length=32)

app01/views.py

from django.shortcuts import render,HttpResponse
from app01.models import Book # 自己创建的book表

def index(request):
    # 添加表记录
    # 方式1:
    book_obj = Book(id=1,title='xibushijie',state=True,pub_date="2018-7-15",price=1288,publish="Westworld")

    # 插入数据
    book_obj.save()

    # 方式二 常用的方式
    """
    数据库中的表 ----- python 中的 class
    表中的记录  ------- 对象
    记录中的字段 ------  属性
    """
    # 这种方式不需要写save他回自动调用这个函数
    # 返回值是当前生成的记录!
    book_obj = Book.objects.create(title='blackMirror',state=True,pub_date="2018-7-15",price=1288,publish="English")
    print(book_obj.title)

    return HttpResponse("OK")

测试:浏览器中输入

http://127.0.0.1:8000/index/

然后再相关数据库中查看数据!


3.单表操作-查询API

示例学习
ORM/urls.py

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/',views.index)
]

app01/views.py

from django.shortcuts import render,HttpResponse
from app01.models import Book # 自己创建的book表

def index(request):
    """准备示例数据
    insert into app01_book(title,state,pub_date,price,publish) values
    ("python",1,"2018-07-15","1200","oldboy"),
    ("go",0,"2018-07-15","1200","oldboy"),
    ("linux",1,"2018-07-16","1211","luffycity"),
    ("java",0,"2018-07-15","1211","oldboy"),
    ("c++",1,"2018-07-16","1212","oldboy"),
    ("JavaScript",1,"2018-07-17","1200","oldboy")
    ;
    """
    # ==================== 查询表记录 ==============
    """查询表记录重点关注两点
        1.方法的返回值
        2.方法的调用者
        另外:都是调用的对象下的objects对象,然后调用相应方法
            all first/last filter get 是常用的
            values values_list distinct是非常重要的!
    """
    # 1. all:返回值是querySet对象,QuerySet 是django自己创建的一种数据类型,列表的形式存贮对象
    # 方法all()拿到所有的数据,如果重写了Book表下的__str__方法,会按照__str__方法显示:
    # all()调用者是QuerySet,返回值是QuerySet对象
    book_list = Book.objects.all()
    print(book_list) # <QuerySet [<Book: xibushijie>, <Book: blackMirror>]>
    for i in book_list:
        print("价格:",i.price)

    # 2. first,last方法 调用者:一个queryset数据类型对象即可,返回一个字段对象,model对象
    book_first = Book.objects.all().first()
    # 等同于Book.objects.all()[length(Book.objects.all())-1]

    # 3. filter() 条件过滤 调用者:QuerySet对象,返回值:QuerySet对象,
    # 由此,filter()之后可以调用first,last方法
    book_filter = Book.objects.filter(price = 10,state=True)
    book_filter_first = book_filter.first()
    print(book_filter,book_filter_first) # <QuerySet []> None

    # 4. get()方法 有且只有一个查询结果时才有意义,如果有多个或者没有会报错
    # 返回值:model对象(一个记录)
    book_get = Book.objects.get(title="blackMirror")

    # 5. exclude() 排除法:调用者QueryS    et, 返回:QuerySet
    book_exclude = Book.objects.exclude(title="go")

    # 6. order_by() 排序 调用者:QuerySet ,返回值:QuerySet
    book_order_by = Book.objects.all().order_by("-id") # -id表示按照id降序排序,默认为升序排序
    book_order_by = Book.objects.all().order_by("-id","price") # 根据多个字段排序

    # 7. reverse() 反转

    # 8. count() 计数 调用者:QuerySet  返回值:int

    # 9. exists() 判断是否存在 返回值:Boolean
    # 例如:Author.objects.filter(name=data["name"]).exists():

    # 10. values() 方法!important 调用者:QuerySet ,返回一个ValueQuerySet——一个特殊的QuerySet,
    #  运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

    res = Book.objects.all().values("title")
    print(res)
    #<QuerySet [{'title': 'xibushijie'}, {'title': 'blackMirror'},...]>

    # 11. values_list()
    res = Book.objects.all().values_list("title",'state')
    print(res) # <QuerySet [('xibushijie', True), ('blackMirror', True),..]

    # 12. distinct():  从返回结果中剔除重复纪录
    # 只根据一个字段取值使用distinct去重才有意义!

    book_distinct = Book.objects.all().values("title").distinct()
    print(book_distinct)

    return HttpResponse("OK")

app01/models.py

from django.db import models

# Create your models here.

# 利用类创建一个Book表 ,必须继承models.Model类
class Book(models.Model):
    id = models.AutoField(primary_key=True,unique=True)
    title = models.CharField(max_length=32)
    state = models.BooleanField()
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.CharField(max_length=32)

    def __str__(self):
        return self.title

4.单表查询--模糊查询

app01/views.py

from django.shortcuts import render,HttpResponse
from app01.models import Book # 自己创建的book表

def index(request):
    # ===============模糊查询========================
    # 大于
    res = Book.objects.filter(price__gt = 10)

    # 大于并小于等于一个值lt是小于
    res = Book.objects.filter(price__gt=10,price__lt=200)

    # 以什么开头
    res = Book.objects.filter(title__startswith="p")

    # 包含某个字符串
    res = Book.objects.filter(title__contains="h")

    # 忽略大小写的包含
    res = Book.objects.filter(title__icontains='h')

    # 多个条件
    res = Book.objects.filter(price__in=[100,200,300])

    # fanwei
    res = Book.objects.filter(price__range=[100,200])

    # 对于日期的格式的数据查找,必须是日期格式!
    res = Book.objects.filter(pub_date__year=2018)
    res = Book.objects.filter(pub_date__month=7)

    #

    print(res)

    return HttpResponse("OK")

app01/models.py 与ORM/urls.py 代码相同!这里略


5.单表查询--删除与修改

app01/views.py

from django.shortcuts import render,HttpResponse
from app01.models import Book # 自己创建的book表

def index(request):
    # ===============代表查询-删除、修改 ===============

    # delete删除 调用者QuerySet 或者model对象,返回值:元组
    # res = Book.objects.filter(price = 200).delete()
    # res = Book.objects.filter(price = 200).first().delete()

    # 修改 只能被QuerySet调用
    res = Book.objects.filter(title="xibushijie").update(title="perl")

    # print(res)

    return HttpResponse("OK")

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:model_obj.delete()
你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:

Entry.objects.filter(pub_date__year=2005).delete()

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。如:

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

Entry.objects.all().delete() 
``` 
如果不想级联删除,可以设置为:

pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)


update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。 

app01/models.py 与ORM/urls.py 代码相同!这里略

---
posted @ 2018-07-16 21:44  哈哈大圣  阅读(237)  评论(0编辑  收藏  举报