• 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>]

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    学习笔记part2 : 写脚本,因为觉得用命令行在存储数据实在太麻烦了,而且还需要从其他地方获得数据然后存到数据库中,这下面是个写在app目录下的脚本

    通过它,把爬虫怕过来的数据存入数据库中

  • 相关阅读:
    BufferedImage学习记录一
    response总结一
    Externalizable接口
    request 总结一
    处理jsp显示文字过长问题
    验证码设计
    ORA01461: 仅能绑定要插入 LONG 列的 LONG 值
    MAP平台在单据中填写好部门后,关闭后重新打开,部门就没有了
    MAP平台设置节点选取范围
    MAP平台java.lang.StackOverflowError
  • 原文地址:https://www.cnblogs.com/zzblee/p/4260815.html
Copyright © 2020-2023  润新知