首页 > 数据库 >Django 模型(数据库)

Django 模型(数据库)

时间:2023-08-03 18:05:40浏览次数:40  
标签:__ abc name models 数据库 Django Person objects 模型


Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py

本节的代码:(Django 1.6, Python 2.7 测试环境)

Django 模型(数据库)_bc

learn_models.zip

大家可以按照我的步骤来开始做:

django-admin.py startproject learn_models        # 新建一个项目       

        cd        learn_models        # 进入到该项目的文件夹       

        django-admin.py startapp people        # 新建一个 people 应用(app)

补充:新建app也可以用 python manage.py startapp people, 需要指出的是,django-admin.py 是安装Django后多出的一个命令,并不是指一个 django-admin.py 脚本在当前目录下。

那么project和app什么关系呢,一个项目一般包含多个应用,一个应用也可以用在多个项目中。

 

将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。

INSTALLED_APPS        =        (       

               'django.contrib.admin'       ,       

               'django.contrib.auth'       ,       

               'django.contrib.contenttypes'       ,       

               'django.contrib.sessions'       ,       

               'django.contrib.messages'       ,       

               'django.contrib.staticfiles'       ,       

              

               'people'       ,       

       )

我们打开 people/models.py 文件,修改其中的代码如下:

from        django.db        import        models       

              

        class        Person(models.Model):       

               name        =        models.CharField(max_length       =       30       )       

               age        =        models.IntegerField()

我们新建了一个Person类,继承自models.Model, 一个人有姓名和年龄。这里用到了两种Field,更多Field类型可以参考教程最后的链接。

 

我们来同步一下数据库

python manage.py syncdb        # 进入 manage.py 所在的那个文件夹下输入这个命令       

              

       注意:Django 1.7 及以上的版本需要用以下命令      

       python manage.py makemigrations      

       python manage.py migrate

Django 模型(数据库)_django_02

我们会看到,Django生成了一系列的表,也生成了我们新建的people_person这个表,那么如何使用这个表呢?

Django提供了丰富的API, 下面演示如何使用它。

$ python manage.py shell      

              

        >>>        from        people.models        import        Person       

        >>> Person.objects.create(name       =       "WeizhongTu"       , age       =       24       )       

        <Person: Person        object       >       

       >>>

我们新建了一个用户WeizhongTu 那么如何从数据库是查询到它呢?

>>> Person.objects.get(name       =       "WeizhongTu"       )       

        <Person: Person        object       >       

       >>>

我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是大家注意到了没有,查询结果中显示<Person: Person object>,这里并没有显示出与WeizhongTu的相关信息,如果用户多了就无法知道查询出来的到底是谁,查询结果是否正确,我们重新修改一下 people/models.py

name 和 age 等字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)

也不能有Python中的关键字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)

from        django.db        import        models       

              

              

        class        Person(models.Model):       

               name        =        models.CharField(max_length       =       30       )       

               age        =        models.IntegerField()       

               

               def        __unicode__(       self       ):       

               # 在Python3中使用 def __str__(self)       

               return        self       .name

按CTRL + C退出当前的Python shell, 重复上面的操作,我们就可以看到:

Django 模型(数据库)_django_03

新建一个对象的方法有以下几种:

  1. Person.objects.create(name=name,age=age)
  2. p = Person(name="WZ", age=23)
    p.save()
  3. p = Person(name="TWZ")
    p.age = 23
    p.save()
  4. Person.objects.get_or_create(name="WZT", age=23)
    这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

 

获取对象有以下方法:

  1. Person.objects.all()
  2. Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
  3. Person.objects.get(name=name)
     
    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
  4. Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
  5. Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
     
  6. Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
  7. Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
     
  8. Person.objects.filter(name__regex="^abc") # 正则表达式查询
  9. Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
     
    filter是找出满足条件的,当然也有排除符合某条件的
  10. Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
  11. Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
     

参考文档:

Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/

Fields相关官方文档:https://docs.djangoproject.com/en/dev/ref/models/fields/

标签:__,abc,name,models,数据库,Django,Person,objects,模型
From: https://blog.51cto.com/u_6186189/6951574

相关文章

  • Django之models模型层2
    一、多表查询之连表查询(基于双下划线的查询)1、2、3、  二、聚合查询(aggregate)1、2、   三、分组查询annotate 1、 2、  四、F与Q查询  五、django中如何开启事务 ......
  • django 1.7 manage.py 详解
    django自从1.7之后解决了很多问题,并且对于数据库的操作带来了几个新命令用以解决数据迁移问题,今天开始看看文档学习一下。部分内容来源于网络Django自1.7之后增加了类似South的migration功能,修改Model后可以在不影响现有数据的前提下重建表结构。这真是个千呼万唤始......
  • Django Rest Framework 教程及API向导
    DjangoRestFramework教程及API向导。一、请求(Request)REST_FRAMEWORK中的Request扩展了标准的HttpRequest,为REST_FRAMEWORK增加了灵活的request解析和request认证。1、请求.data:获取请求的主体,相当于request.POST和request.FILES.query_params:  request.GET的重命名.p......
  • Django常见出错解决方案汇总
    一、模板类型错误:错误原因:在models中漏掉了return:classUserProfile(models.Model):"""功能说明:扩展用户---------------------------------------------------------------------------修改人修改时间修改原因......
  • 大模型(LLM)最新趋势总结
    关键结论:开源社区模型不具备真正智能,更好的小模型来自大模型的ScaleDownGPT-4模型信息:采用MoE架构,16个experts,800b参数如何减少幻觉hallucination?scaling/retrieval/rewardmodel指令遵循的开源小模型被过度炒作,已经到达瓶颈,突破方向是更强的BaseModel和更进一步的反馈......
  • 国标GB28181平台LntonGBS(源码版)国标视频平台在连接MySQL数据库时提示“can’t connect
    LntonGBS国标视频云服务平台不仅支持无缝、完整接入内网或者公网的国标设备,还能够实现全平台、全终端输出。该平台支持将GB/T28181的设备/平台推送的PS流转成ES流,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务,实现Web浏览器、手机浏览器、微信端、PC客户端等各终......
  • 外键字段的增删改查,多表查询,正反向的概念,子查询,多表查询之连表查询(基于双下划线
    外键字段的增删改查#多对多的外键增删改查图书和作者是多对多,借助于第三张表实现的,如果想绑定图书和作者的关系,本质上就是在操作第三方表#如何操作第三张表问题:让你给图书添加一个作者,他俩的关系可是多对多#多对多的增删该查#让你给图书id=2添加一个作者id=1b......
  • 解决大模型“开发难”,昇思MindSpore自动并行技术应用实践
    本文分享自华为云社区《DTSETechTalk|第35期:解决大模型“开发难”,昇思MindSpore自动并行技术应用实践》,作者华为云社区精选。昇思MindSpore是新一代覆盖端边云全场景的开源AI框架,旨在开创全新的AI编程范式,降低开发者门槛,为开发者打造开发友好、运行高效、部署灵活的AI框架,推动人......
  • MySQL语句判断数据库数据重复情况,新增、删除、不变。
    判断7月8月两个月数据对比情况,新增、删除(离职)、重复。 根据manager_name,gg_name,employer,department,historical_office判断出是否重复数据--●-新增或离职--●-创建临时表CREATETABLEtemp_table(SELECTid,manager_name,gg_name,employer,department......
  • django自定义错误补获
    settings.pyREST_FRAMEWORK={'EXCEPTION_HANDLER':'xxx.custom_exception_handler',}新建.py文件,名称任意 xxx.pyfromdjango.dbimportDatabaseErrorfromrest_frameworkimportstatusfromrest_framework.responseimportResponsefromrest......