初学Django基础02

时间:2019-10-22
本文章向大家介绍初学Django基础02,主要包括初学Django基础02使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

django的ORM操作

之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块

常用字段

  AutoField

int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

  IntegerField

一个整数类型,范围在 -2147483648 to 2147483647。

  CharField

字符类型,必须提供max_length参数, max_length表示字符长度。

  DateField

日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。

  DateTimeField

日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

创建表结构

#models.py

from django.db import models


# Create your models here.
class Nav(models.Model):
    name = models.CharField(max_length=10, unique=True,
                            verbose_name='导航名称')  # max_length最大个数,unique是否唯一,verbose_name表的中文名
    is_delete = models.SmallIntegerField(default=1, verbose_name='是否被删除')  # default默认值
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add插入数据的时候,自动取当前时间
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)  # auto_now修改数据的时候,时间会自动变

    def __str__(self):
        return self.name  # __str__如果不写打印的是一个对象,加上这段可以打印name值

    class Meta:  # 表结构的其他信息
        verbose_name = '导航表'  # 表的中文名
        verbose_name_plural = verbose_name  # 表的中文名
        db_table = 'nav'  # 表名
        # ordering = ['update_time']#查询数据的时候,用来排序的


class Article(models.Model):
    title = models.CharField(max_length=20, verbose_name='文章名称')
    content = models.TextField(null=True, verbose_name='文章内容')  # null 是否为空
    img = models.ImageField(upload_to='article_img', null=True, verbose_name='文章图片',
                            default='article_img/1.jpg')  # ImageField上传文件,upload_to上传了图片会在setting设置的MEDIA_ROOT路径下自动创建一个article_img的文件夹,注意要使用文件上传必须安装pillow模块
    file = models.FileField(upload_to='file_img',
                             verbose_name='文件图片')  # FileField与ImageField的唯一不同是ImageField只能上传图片格式的文件,而FileField能上传所有文件
    is_delete = models.SmallIntegerField(default=1, verbose_name='是否被删除')
    nav = models.ForeignKey(Nav, verbose_name='导航id', on_delete=models.DO_NOTHING, db_constraint=False)  # 外键
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    update_time = models.DateTimeField(verbose_name='修改时间', auto_now=True)

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'article'

运行到数据库中

  python manage.py makemigrations #生成迁移文件

  python manage.py migrate #同步到数据库中

djangoORM的增删改查

# 这三句表示告诉django我要操作哪个数据库
import django, os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_test.settings')  # 设置django的配置文件
django.setup()  # 配置并检查

from user import models  # 找到对应的表结构文件

# 新增
models.Nav.objects.create(name='我的日记')

# 这样也可以新增
nav_obj = models.Nav(name='我的心情', is_delete=1)
nav_obj.save()

# 查询
# get方法查询的话,必须得保证这个数据查出来只有1条,才可以
result = models.Nav.objects.get(is_delete=1)
print(result.name)

# 加了filter搜索出来的结果就有可能是多条
result0 = models.Nav.objects.filter(is_delete=1, name='我的心情')  # and
result1 = models.Nav.objects.filter(name__contains='我的')  # 模糊查询
result1_1 = models.Nav.objects.filter(create_time__endswith='84')  # 查询匹配结尾字符
result1_2 = models.Nav.objects.filter(create_time__startswith='2019')  # 查询匹配开头字符
result1_3 = models.Nav.objects.filter(create_time__isnull=True)  # 查询是否为空的
result2 = models.Nav.objects.filter(id__gt=0)  # 大于0
result3 = models.Nav.objects.filter(id__gte=1)  # 大于等于1
result4 = models.Nav.objects.filter(id__lt=2)  # 小于2
result5 = models.Nav.objects.filter(id__range=[1, 5])  # 一个范围之间
result6 = models.Nav.objects.filter(id__in=[1, 2, 3, 5, 6])  # in
result7 = models.Nav.objects.exclude(id=1)  # 排除,除了id为1的

from django.db.models import Q

result8 = models.Nav.objects.filter(Q(name__contains='6') | Q(name__contains='3'))  #

result9 = models.Nav.objects.all().filter(name__contains='6')  # 获取表里面所有的数据
result10 = models.Nav.objects.all().filter(name__contains='6').count()  # count可以获取个数
result11 = models.Nav.objects.all().filter(name__contains='6').values()  # values返回字典显示
result12 = models.Nav.objects.raw('select * from nav')  # 执行原生sql

# 修改

# 此方法修改就是对一个值重新赋值的方式
n = models.Nav.objects.get(id=1)  # parimy key
n.name = 'wo的相册2'
n.is_delete = 1
n.save()

models.Nav.objects.all().update(is_delete=0)  # 更新表里面所有数据
models.Nav.objects.filter(name__contains='我的').update(is_delete=1)  # 根据条件

# 删除

models.Nav.objects.all().delete()  # 删除表里面所有数据
models.Nav.objects.filter(id__lt=3).delete()  # 根据条件删除

n = models.Nav.objects.get(id=3)  # parimy key单个删除
n.delete()

# 反向查询
art_obj = models.Nav.objects.get(name='我的日记3')
print(art_obj.article_set.filter())  # 外键反向查询

# nav_obj.article_set.add(art_obj)#添加
# nav_obj.article_set.remove(art_obj)#删除
# nav_obj.article_set.clear()#清空

原文地址:https://www.cnblogs.com/RainBol/p/11718456.html