Django之model基础(增删改查)

Posted Sober--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之model基础(增删改查)相关的知识,希望对你有一定的参考价值。

一、ORM

映射关系

       表名  <-------> 类名

       字段  <-------> 属性

    表记录 <------->类实例对象
二、创建表(建立模型)

在创建表之前的准备工作:
第一步:在创建表之前,首先应该在mysql中创建一个数据库。
第二步:在setting配置文件中进行数据库连接的相关配置。
即# 修改django默认的数据库的sqlite3为mysql
DATABASES = {
        default: {
            ENGINE: django.db.backends.mysql,  #通过这个去链接mysql
            NAME: bookadmin,  #自己创建的数据库名
            USER:root,
            PASSWORD:123,
            HOST:localhost,
            PORT:3306,
        }
    }

 

第三步:在app01--init文件中导入pymysql,再写上这一句  pymysql.install_as_MySQLdb()

第四步:创建数据库表的执行命令(需要记住的两条命令)

   python manage.py  makemigrations   创建脚本

   python manage.py   migrate 迁移

  我们基于图书管理系统,做一个增删改查的功能

  首先,先在modle模块中创建一张Book表,具体代码如下。

from django.db import models

# Create your models here.
class Book(models.Model):
    nid = models.AutoField(primary_key=True)    
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)

字段选项

每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。还有一些适用于所有字段的通用参数。 这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:

技术分享
(1)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
三、添加表记录
添加表记录的方式有如下两种:
方式1
book_obj=models.Book(title=title,author=author,publishDate=pubDate,price=price)
 book_obj.save()
方式二
book_obj=models.Book.objects.create(title=title,publishDate=publishDate,price=price)
四、查看表记录
1、先在视图函数view中将数据取出来
from app01 import models    #app01是应用名

def index(request):
    # 从数据库取出所有书籍对象
    bookList=models.Book.objects.all()  #    [bookObj1,.....]
    return render(request,"index.html",{"bookList":bookList})
查询相关
<1> all():    查询所有结果
<2> filter():    查询所给筛选条件相匹配的对象

2、在template模版中接收

{% for book_obj in bookList %}
                             <tr>
                                   <td>{{ book_obj.nid }}</td>
                                   <td>{{ book_obj.title }}</td>
                                   <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
                                   <td>{{ book_obj.price }}</td>
                                   

                               </tr>
                      {% endfor %}
五、查询表记录
1.与查询相关的API
<1> all():                 查询所有结果
 
<2> filter(**kwargs):      它包含了与所给筛选条件相匹配的对象,即过滤
 
<3> get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                           如果符合筛选条件的对象超过一个或者没有都会抛出错误。拿到的是一个model对象,区别于filter
 
<5> exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象,即除过筛选对象外的所有记录
 
<4> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                           model的实例化对象,而是一个可迭代的字典序列
 
<9> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
<6> order_by(*field):      对查询结果排序
 
<7> reverse():             对查询结果反向排序
 
<8> distinct():            从返回结果中剔除重复纪录
 
<10> count():              返回数据库中匹配查询(QuerySet)的对象数量。
 
<11> first():              返回第一条记录
 
<12> last():               返回最后一条记录
 
<13> exists():             如果QuerySet包含数据,就返回True,否则返回False
注意注意:一定区分model对象与querySet的区别 !!!
model对象可以调用它下面的所有属性方法,可以用.的形式调用属性,Queryset得到的是一个集合。
2.双下划线之单表查询
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
 
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 

 

六、删除表记录

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。

比如我们给表中添加一个删除按钮来实现点击按钮后数据库每条记录的删除

1.template模板

{% for book_obj in bookList %}
    <tr>
        <td>{{ book_obj.nid }}</td>
        <td>{{ book_obj.title }}</td>
        <td>{{ book_obj.author }}</td>
        <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
        <td>{{ book_obj.price }}</td>
        <td>
            <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
        </td>
    </tr>
{% endfor %}
2.url分发
urlpatterns = [
    url(r^admin/, admin.site.urls),
    url(r^index/, views.index),
    url(r^del/(\d+), views.delBook),
]
3.视图函数view实现删除
def delBook(request,id):
    models.Book.objects.filter(nid=id).delete()
    return redirect("/index/")

 

























以上是关于Django之model基础(增删改查)的主要内容,如果未能解决你的问题,请参考以下文章

Django之数据表增删改查

Django 08. django框架模型之增删改查进阶

django之Model(数据表)的增删改查

django基础 5 作者的增删改查

Django之ORM的增删改查

django之数据库表的增删改查