Django学习笔记2

Django 模型(model)

1.对应关联关系,多对多[many-to-many] 一对一[one-to-many] ,也叫做外键 foreignkey

一本书有一个或多个作者,和作者的关系是多对多的关联关系[many-to-many]和出版商的关系是一对多[one-to-many]

class Book(models.Model):
   title=model.CharField(max_length=100)
   authors=models.ManyToManyField(Author)
   publisher=models.ForeignKey(Pulisher)

每个模型相当与于单个数据库表,每个属性也是这个表中的一个字段.属性名就是字段名,它的类型就相当于数据库的字段类型

"每个数据库表对应一个类"这条规则的例外情况是多对多关系,在上面的模型中,Bokk有一个多对多字段,叫做auhtors,该字段表明一本书有多个作者,但book数据库中却并没有authors字段,相反,Django创建了一个额外的表(多对多链接表)来处理书和作者的映射关系,

每个新闻对应多个标签----新闻-标签链接表??那在哪呢??

2. 模型安装

激活这个模型,找到setting.py文件,找到INSTALLED_APPS设置,这个设置告诉Django哪些app处于激活状态

遇到一个错误,原始是所有的modles里面的函数都必须有原括号打少一个news_date=models.DateField()

TypeError: Error when calling the metaclass bases
    unbound method contribute_to_class() must be called with DateField instance as first argument (got ModelBase instance instead)

3.检验模型有效性代码:

python manage.py validate

生成create table 语句,mysie是app名,但是因为我的是migrate不行 - -

python manage.py sqlall mysite

同步到数据库中,因为syncdb命令不可以用,这里必须用makemigration 和 migrate

Run ‘manage.py makemigrations‘ to make new migrations, and then re-run ‘manage.py migrate‘ to apply them.
$ python manage.py makemigrations
Migrations for ‘mysite‘:
  0001_initial.py:
    - Create model Article
    - Create model Tag
    - Create model User
$ python manage.py migrate
Operations to perform:
  Apply all migrations: mysite
Running migrations:
  Applying mysite.0001_initial... OK

4.基本数据访问

  • 首先,导入Publisher模型类, 通过这个类我们可以与包含 出版社 的数据表进行交互。
  • 接着,创建一个`` Publisher`` 类的实例并设置了字段`` name, address`` 等的值。
  • 调用该对象的 save() 方法,将对象保存到数据库中。 Django 会在后台执行一条 INSERT 语句。
  • 最后,使用`` Publisher.objects`` 属性从数据库取出出版商的信息,这个属性可以认为是包含出版商的记录集。 这个属性有许多方法, 这里先介绍调用`` Publisher.objects.all()`` 方法获取数据库中`` Publisher``类的所有对象。这个操作的幕后,Django执行了一条SQL `` SELECT`` 语句。
>>> from books.models import Publisher
>>> p1 = Publisher(name=‘Apress‘, address=‘2855 Telegraph Avenue‘,
... city=‘Berkeley‘, state_province=‘CA‘, country=‘U.S.A.‘,
... website=‘http://www.apress.com/‘)
>>> p1.save()
>>> p2 = Publisher(name="O‘Reilly", address=‘10 Fawcett St.‘,
... city=‘Cambridge‘, state_province=‘MA‘, country=‘U.S.A.‘,
... website=‘http://www.oreilly.com/‘)
>>> p2.save()
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]

5.显示对象的问题,

[<Publisher: Publisher object>, <Publisher: Publisher object>]看不出东西

,只需要为 Publisher 对象添加一个方法 __unicode__() 。 __unicode__() 方法告诉Python如何将对象以unicode的方式显示出来。 为以上三个模型添加 __unicode__() 方法后,就可以看到效果了:

    def __unicode__(self):
        return self.headline

6.对数据库操作:

  1. 插入和更新数据: 创建实例对象,使用参数创建,调用save()方法保存到数据库中,创建完自动赋一个主键id

    b=Book(title="bigbang",
           author="GD",)b.save()b.title="TOP",修改b.save()
  2. 选择对象,取出所有记录

    Book.objects.all()
    [<Book: bigbang>,<Book:b2>]
  3. 数据过滤,用filter()方法,可以传一个到多个参数

    Book.objects.filter(titile=‘bigbang‘)
    Publisher.objects.filter(name_contains="press")变量_contain可以用来寻找包含这个字段的,比如Appress还有其他查找:incontains(无关大小写) startwith 和 endwith, 还有range
  4. 获得单个对象,filter是返回一个记录集是一个列表,但是不是单个对象,我们用get()获得单个对象,如果是多个对象会抛出异常

    Book.objects.get(name="Apress")
    <Publisher:Apress>
  5. 数据排序,根据某个字段的值对搜索结果排序,比如按字母排序 用order_by(),可对任意字段排序

    >>> Publisher.objects.order_by("name")
    [<Publisher: Apress>, <Publisher: O‘Reilly>]

    对多个字段排序(第二个字段会在第一个字段的值相同的情况下被使用到)

    >>> Publisher.objects.order_by("state_province", "address")
    [<Publisher: Apress>, <Publisher: O‘Reilly>]

    我们还可以指定逆向排序,在前面加一个减号 ‐ 前缀:

  6. >>> Publisher.objects.order_by("‐name")
    [<Publisher: O‘Reilly>, <Publisher: Apress>]

    尽管很灵活,但是每次都要用 order_by() 显得有点啰嗦。 大多数时间你通常只会对某些 字段进行排序。 在这
    种情况下,Django让你可以指定模型的缺省排序方式:

    现在,让我们来接触一个新的概念。 class Meta ,内嵌于 Publisher 这个类的定义中(如果 class Publisher
    是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中
    使用 Meta 类,来设置一些与特定模型相关的选项

    class Publisher(models.Model):
          name = models.CharField(max_length=30)
          address = models.CharField(max_length=50)
          city = models.CharField(max_length=60)
          state_province = models.CharField(max_length=30)
          country = models.CharField(max_length=50)
          website = models.URLField()
          def __unicode__(self):
          return self.name
         **class Meta:**
         **ordering = [‘name‘]**
  7. 连锁查询:   我们已经知道如何对数据进行过滤和排序。 当然,通常我们需要同时进行过滤和排序查询的操作。 因此,你可以简单地写成这种“链式”的形式:
  8. >>> Publisher.objects.filter(country="U.S.A.").order_by("‐name")
    [<Publisher: O‘Reilly>, <Publisher: Apress>]
  9. 限制返回的数据:取出固定数目的记录

    >>> Publisher.objects.order_by(‘name‘)[0]
       <Publisher: Apress>
  10. 更新多个对象
  11. 删除对象 delete()

    >>> p = Publisher.objects.get(name="O‘Reilly")
    >>> p.delete()
    >>> Publisher.objects.all()
    [<Publisher: Apress Publishing>]
时间: 2024-08-07 14:54:04

Django学习笔记2的相关文章

Django 学习笔记(七)数据库基本操作(增查改删)

一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.py 5.同步数据 二.安装IPython方便debug sudo apt-get install ipython3 安装成功后用python manage.py shell 会自动进入Ipython交互解释器中,没有安装Ipython只有前两行代码,只进入到Python shell 中. Python 3.5

Django学习笔记 Day One

Time:2016年01月01日21:38:55 Description: 从今天开始我开始写我的Django学习笔记,因为网络上太多太杂乱的文章,不成系统,还有就是太多的培训机构讲述的东西过于简单,没有深入讲解Django,算是自己的一个小笔记吧,主要参考的是Django1.8的官方文档,地址:www.djangoproject.com,一家之言,大神勿喷! Content: Day One. First exploration of django? 我们在Web开发过程中,常常会遇到编写重复

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

Django学习笔记(五)—— 表单

疯狂的暑假学习之  Django学习笔记(五)-- 表单 参考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path                                 除域名以外的请求路径,斜杠开头                      "/hello/" request.get_host()                      主机名                              

django学习笔记

用的windows操作系统,真是蛋疼啊,等赚了钱,我真要买一台苹果或者换个12寸的小本,用ubuntu,所以一下命令都是windows的,真心蛋疼啊,为什么没有自动补完啊 首先,随便下个django. 然后,进入命令行,进入django的文件夹键入如下命令 django>python setup.py install 经过短时间的等待,安装完成. 然后随便建一个文件夹,比如myproject,命令行进入文件夹,然后输入如下命令,一个django项目就算建好了 myproject>django-

Django学习笔记(四)—— Admin

疯狂的暑假学习之  Django学习笔记(四)-- Admin 参考:<The Django Book> 第6章 Django 可以使用admin自动创建管理界面. 1. 配置 django-admin.py startproject 创建的项目,如果没有注解掉默认的配置,python manage.py syncdb 创建用户后,直接 http://xxxxxx/admin 输入密码即可进入. 如果修改了配置文件,保证将 django.contrib.admin 加入setting.py 中

Django 学习笔记之三 数据库输入数据

假设建立了django_blog项目,建立blog的app ,在models.py里面增加了Blog类,同步数据库,并且建立了对应的表.具体的参照Django 学习笔记之二的相关命令. 那么这篇主要介绍往数据库中添加数据,django默认的是sqlite3数据库. 在建立完django_blog项目后,不要忘了把 blog 加入到 settings.py 中的 INSTALLED_APPS 中. 一.同步数据库,创建相应的表 具体的参照Django 学习笔记之二的的同步数据库. 二.数据输入 下

Django学习笔记汇总

1. 学习历程 从学了Python以来,我都一直想着用它来做点什么.从开始用python来写简单的工具脚本,然后再是网络信息抓取程序. 听说可以用Python来做网站,所以我了解了一下web.py与Django.第一次接触Django,由于没有网络方面的基础,所以没弄两下就放弃了. 后来,我研究了一下Python自来的SimpleHTTPServer,然后读懂了CGIHTTPServer,才对Web的实质有了了解. 在这个基础上,我再次重拾Django.这次,终于学会了. 原来它是那么的美妙!

Django学习笔记(二)—— 模板

疯狂的暑假学习之 Django学习笔记(二)-- 模板 参考: <The Django Book> 第四章 一.模板基础知识 1.模板是如何工作的 用 python manage.py shell 启动交互界面(因为manage.py 保存了Django的配置,如果直接python启动交互界面运行下面代码会出错) 输入下面代码 >>> from django import template >>> t = template.Template('My name

Django 学习笔记(六)MySQL配置

环境:Ubuntu16.4 工具:Python3.5 一.安装MySQL数据库 终端命令: sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 过程中会让你输入用户名(默认root)和密码,输入后按下方向即可跳转到确定按钮,再按Enter sudo netstat -tap | grep mysql检测是否安装成功,当处于 liste