django模型操作

配置
1.创建 urls.py文件 (user应用里)

2.在 主路由配置
path(’’,include(‘user.urls’))
#导包路径 sys.path 必须有个 apps目录 作为查找包的路径

3.settings里
import sys # python解释器系统
sys.path.insert(0,os.path.join(BASR_DIR,‘apps’))

#配置应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',

]

# 配置数据库
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': '数据库名',
    'HOST': '127.0.0.1',
    'PORT': 3306,
    'USER': 'root',
    'PASSWORD': '密码'
}

}

# 指默认的用户模型  django特有的模型路径
# '应用名.模型名'
# 1.系统路径 文件 文件夹
# 2.python解释器系统导包路径
# 3.django系统的模型路径
AUTH_USER_MODEL = 'user.User'

Django路径问题

文件路径(os.path) windows操作系统的路径
导包路径(sys.path) python解释器系统 查找包的路径
模块路径(user.User) django特有的模型路径
模型路径

外键的顺序调换 会报错

=报错==

1 直接写模型名

class Pinglun(models.Model):
content = models.CharField()
user = models.ForeignKey(User)

class User(AbstractUser):
# 冗余设计
phone = models.CharField(‘手机号’, max_length=24)

class Meta:
    db_table = 'tb_user'

=不报错==

2 使用模型路径(应用名.模型名)

class Pinglun(models.Model):
    content = models.CharField()
    user = models.ForeignKey('user.User')  

class User(AbstractUser):
    # 冗余设计
    phone = models.CharField('手机号', max_length=24)

    class Meta:
        db_table = 'tb_user'

demo

进入目录: ls syl
进入目录: cd apps
#因为 manage.py 文件 是在 syl目录下
创建应用: python …/manage.py startapp demo

#配置应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
'demo_app.apps.DemoAppConfig',

]

from django.db import models

#定义图书模型类BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name=‘名称’)
bpub_date = models.DateField(verbose_name=‘发布日期’)
bread = models.IntegerField(default=0, verbose_name=‘阅读量’)
bcomment = models.IntegerField(default=0, verbose_name=‘评论量’)
is_delete = models.BooleanField(default=False, verbose_name=‘逻辑删除’)

class Meta:
    db_table = 'tb_books'  # 指明数据库表名
    verbose_name = '图书'  # 在admin站点中显示的名称
    verbose_name_plural = verbose_name  # 显示的复数名称

def __str__(self):
    """定义每个数据对象的显示信息"""
    return self.btitle

#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, ‘female’),
(1, ‘male’)
)
hname = models.CharField(max_length=20, verbose_name=‘名称’)
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name=‘性别’)
hcomment = models.CharField(max_length=200, null=True, verbose_name=‘描述信息’)
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name=‘图书’) # 外键
is_delete = models.BooleanField(default=False, verbose_name=‘逻辑删除’)

class Meta:
    db_table = 'tb_heros'
    verbose_name = '英雄'
    verbose_name_plural = verbose_name

def __str__(self):
    return self.hname

查询操作

‘’’
get 获取一个
all filter exclude 获取多个
‘’’

错误操作==
BookInfo.objects.get(id=5)

该条信息不存在 报错

demo_app.models.DoesNotExist: BookInfo matching query does not exist.

BookInfo.objects.get(bread=0)

有多个结果的时候 报错

demo_app.models.MultipleObjectsReturned: get() returned more than one BookInfo – it returned 2!

可以这样使用 get方法 不会报错

try:
book=BookInfo.objects.get(id=0)
# 有且只有一个结果的时候 才会成功
except:
book=None

正确操作==

  1. 获取满足条件的 (filter)
    bobooks=BookInfo.objects.filter(id=1)
    book=books.first()
    print(book) # 射雕英雄传

  2. books=BookInfo.objects.filter(id=0)
    print(books) #<QuerySet []>
    book=books.first() # books.last()
    print(book) # None

  3. 不满足条件的 (exclude)
    books=BookInfo.objects.exclude(id=1)
    print(books)
    <QuerySet [<BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>, <BookInfo: 雪山飞狐>, <BookInfo: 新书>, <BookInfo: 新书3>]>

  4. 获取全部数据 (all)
    books=BookInfo.objects.all() # 所有的
    print(books.first()) # 射雕英雄传

  5. filter方法

    1. #查询书名包含’传’的图书。
      book=BookInfo.objects.filter(btitle__contains=‘传’)
      print(book) # <QuerySet [<BookInfo: 射雕英雄传>]>

    2. #查询书名以 '天’开头的图书
      #查询书名以 '狐’结尾的图书
      book=BookInfo.objects.filter(btitle__startswith=‘天’)
      print(book) # <QuerySet [<BookInfo: 天龙八部>]>
      books=BookInfo.objects.filter(btitle__endswith=‘狐’)
      print(books) # <QuerySet [<BookInfo: 雪山飞狐>]>

    3. 给英雄随便加一条 hcomment 为空的信息 不是字符串

      给英雄随便加一条 hcomment 为空字符串的信息

      hero=HeroInfo.objects.filter(hcomment=’’)
      for i in hero:
      print(i.id) # 18

      hero=HeroInfo.objects.filter(hcomment=None)
      hero=HeroInfo.objects.filter(hcomment__isnull=True)
      for i in hero:
      print(i.id) # 19

    4. book=BookInfo.objects.filter(bread__in=[12,36,20])
      book=BookInfo.objects.filter(bread__range=[12,50])
      book=BookInfo.objects.filter(bread__in=[i for i in range(12,50)])
      print(book) #
      <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>]>

    5. books=BookInfo.objects.filter(bpub_date__year__gt=‘1990’)
      books=BookInfo.objects.filter(bpub_date__month__gt=‘10’)
      books=BookInfo.objects.filter(bpub_date__day__gt=‘20’)

      每周的第一天是周日

      books=BookInfo.objects.filter(bpub_date__week_day=‘1’)

      year、month、day、week_day、hour、minute、second

      bpub_date:年月日 bpub_date__year 年 __gt 大于

      print(books)

    6. 例:查询阅读量大于等于评论量的图书。

      from django.db.models import F

      一个对象的两个字段之间的进行比较 F(‘另外一个字段名’)

      book=BookInfo.objects.exclude(bread=0).filter(bread__gte=F(‘bcomment’))
      print(book)
      books=BookInfo.objects.exclude(bread=0).filter(bread__gte=F(‘bcomment’)*2)
      print(books)

      <QuerySet [<BookInfo: 雪山飞狐>]>

    7. Q对象

      多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

      例:查询阅读量大于20,并且编号小于3的图书。

      book=BookInfo.objects.filter(bread__gt=20,id__lt=3)
      print(book)

      <QuerySet [<BookInfo: 天龙八部>]>

      例:查询阅读量大于20,或编号小于3的图书。

      book=BookInfo.objects.filter(Q(bread__gt=20)|Q(id__lt=3))
      print(book)
      #<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 雪山飞狐>]>

    8.  # 例:查询图书的总阅读量。
       from django.db.models import Sum,Avg,Count,Min,Max
      
       books=BookInfo.objects.all()
       # 从数据库中取了所有的书的数据 (取回的数据量大)
       bread_count=0
       for i in books:
           bread_count+=i.bread # 累加 需要遍历
       print(bread_count) # 126
      
      
       book=BookInfo.objects.aggregate(Sum('bread'),
                                       Avg('bread'),
                                       Count('bread'),
                                       Min('bread'),
                                       Max('bread'))
       # 数据库给累加的 快速高效
       print(book)
      
       # 聚合函数 Avg平均 Count 数量 Max 最大 Min最小 Sum 求和
       {'bread__sum': 126, 'bread__avg': 21.0,
       'bread__count': 6, 'bread__min': 0, 'bread__max': 58}
      
    9. books=BookInfo.objects.all().order_by('bread')
      print(books)
      books=BookInfo.objects.all().order_by('-bread')
      print(books)
      
    10. 关联查询
      # 关联查询 两方 从一方查另外一方 关联查询
      book_1=BookInfo.objects.get(id=1)

      hero=HeroInfo.objects.get(id=1)
      book=hero.hbook # 是英雄所在书籍的对象
      print(book.id)
      print(book.btitle)
      # 所属关系 英雄是属于书的 外键要在英雄里面写
      # 通过英雄查书 说书是属于作者的
      两个表的关系 不是一个关系的时候 
      # 获取图书的英雄
      book=BookInfo.objects.get(id=1)
      # 管理器 管理外键关系
      heros=book.heroinfo_set.all() # 集合
      print(heros)	
      
      
      related_name='' 重写 默认多出来的字段的名称
      # 被指向模型 默认会多出来一个字段 heroinfo_set
      '''
       class Teacher():
       	name=''
      
      class Person():
          name=''
          friend=fk(Teacher,related_name='friends')
          teacher=fk(Teacher,related_name='students')
       '''
      
    11.关联 过滤查询
        # 过滤查询 条件是关联模型的属性
         heros=HeroInfo.objects.filter(hbook__btitle__contains='传')
         print(heros)
         books=BookInfo.objects.filter(heroinfo__hname__startswith='郭')
         print(books)
         books=BookInfo.objects.filter(heroinfo__hcomment__contains='掌')
         print(books.distinct()) # 模型集的去重方法
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值