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/")

 





转载于:https://www.cnblogs.com/moning/p/7738357.html

Django 是一款基于 Python 的高效率、高可用性的 Web 开发框架,采用了 MVC 设计模式。其中 `model` 是 Django 中的重要组成部分,用于处理数据库操作。下面是一个简单的 Django Model 示例,展示如何创建模型以及对数据进行增删改查的操作。 ### 创建 Model 首先,我们需要在项目的 models.py 文件中定义一个模型类。例如: ```python from django.db import models class User(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) email = models.EmailField(unique=True) def __str__(self): return f"{self.first_name} {self.last_name}" ``` 在这个例子中,我们创建了一个名为 `User` 的模型,它包含了三个字段:名字、姓氏和电子邮件地址。每个字段都通过 `models.` 后面跟上其类型定义。 ### 定义管理器 在某些情况下,我们需要自定义查询过程,可以使用 `Manager` 来实现这一点: ```python class UserManager(models.Manager): def create_user(self, username, password, **extra_fields): if 'email' not in extra_fields: raise ValueError("The given email must be set") user = self.model(username=username, **extra_fields) user.set_password(password) user.save(using=self._db) return user ``` ### 运行迁移 在完成了模型定义之后,需要运行 migration 以便在数据库中创建对应的表结构: ```bash python manage.py makemigrations python manage.py migrate ``` ### 操作数据 #### 添加数据(Create) 添加新用户到数据库中: ```python from myapp.models import User new_user = User.objects.create(first_name='John', last_name='Doe', email='john.doe@example.com') ``` #### 查询数据(Read) 获取所有用户: ```python users = User.objects.all() for user in users: print(user) ``` 查询特定条件下的用户,比如查找所有邮箱包含 'example.com' 的用户: ```python users_with_example_email_domain = User.objects.filter(email__icontains='@example.com') ``` #### 更新数据(Update) 更新用户信息: ```python updated_user = User.objects.get(id=new_user.id) updated_user.email = "new-email@example.com" updated_user.save() ``` #### 删除数据(Delete) 删除用户: ```python User.objects.get(id=new_user.id).delete() ``` ### 总结 以上就是关于 Django Model 增删改查的基本操作示例。Django 提供了强大的 ORM(Object Relational Mapping),使得开发者能够以一种面向对象的方式来操作数据库,极大地提高了开发效率并降低了出错的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值