04 django之ORM操作

表说明、数据库连接、pycharm配置、ORM操作均可参考:

https://www.cnblogs.com/sss4/p/7070942.html(非常全面和完整)

1 创建并保存对象到数据库

(1)方式一,save方法

>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()

(2)方式二,create方法(一步完成对象的创建与存储至数据库)

>>> p1 = Publisher.objects.create(name='Apress',
...     address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')

2 更新数据

2.1 更新指定字段的数据

(1)save方式

>>> p.id
52   
>>> p.name = 'Apress Publishing'
>>> p.save()
执行的 save() 相当于下面的SQL语句:
UPDATE books_publisher SET
    name = 'Apress Publishing',
    address = '2855 Telegraph Ave.',
    city = 'Berkeley',
    state_province = 'CA',
    country = 'U.S.A.',
    website = 'http://www.apress.com'
WHERE id = 52;

注意:该方法并不是只更新修改过的那个字段,所有的字段都会被更新。 这个操作有可能引起竞态条件

(2)调用结果集(QuerySet)对象的update()方法

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

与之等同的SQL语句变得更高效,并且不会引起竞态条件。
UPDATE books_publisher
SET name = 'Apress Publishing'
WHERE id = 52;

update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录。
以下示例演示如何将所有Publisher的country字段值由’U.S.A’更改为’USA’:12
>>> Publisher.objects.all().update(country='USA')
2
update()方法会返回一个整型数值,表示受影响的记录条数。 在上面的例子中,这个值是2。

3 排序

3.1 order_by()方法

升序排列:
>>> Publisher.objects.order_by("name")
[, ]

降序排列:
>>> Publisher.objects.order_by("-name")
[, ]

按多个字段排列(第二个字段会在第一个字段的值相同的情况下被使用到):
>>> Publisher.objects.order_by("state_province", "address")
 [, ]

3.2 class Meta的方式

每次都用 order_by() 显得有点啰嗦, 通常只会对某些字段进行排序。 在这种情况下,Django让你可以指定模型的缺省排序方式:

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']**
你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项。 如果你设置了ordering这个选项,那么除非你检索时特意额外地使用了 order_by(),
否则,当你使用 Django 的数据库 API 去检索时,Publisher对象的相关返回值默认地都会按 name 字段排序。

4 连锁查询

需要同时进行过滤和排序查询的操作时,可以简单地写成这种“链式”的形式:

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")
[, ]

5 限制返回的数据

想象一下你有成千上万的出版商在你的数据库里, 但是你只想显示第一个。 可以使用标准的Python列表裁剪语句:

>>> Publisher.objects.order_by('name')[0]


类似的,可以用Python的range-slicing语法来取出数据的特定子集:
>>> Publisher.objects.order_by('name')[0:2]
这个例子返回两个对象,等同于以下的SQL语句:
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
OFFSET 0 LIMIT 2;

注意,不支持Python的负索引(negative slicing):
>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
  ...
AssertionError: Negative indexing is not supported.
虽然不支持负索引,但是可以使用其他的方法。 比如,修改order_by() 语句来实现:
>>> Publisher.objects.order_by('-name')[0]

6 删除对象

删除数据库中的对象只需调用该对象的delete()方法即可:
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.all()
[]    #少了一条记录

同样我们可以在结果集上调用delete()方法同时删除多条记录。这一点与我们上一小节提到的update()方法相似:
>>> Publisher.objects.filter(country='USA').delete()
>>> Publisher.objects.all().delete()
>>> Publisher.objects.all()
[]

删除数据时要谨慎! 为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。
比如,下面的操作将会出错:
>>> Publisher.objects.delete()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Manager' object has no attribute 'delete'

而一旦使用all()方法,所有数据将会被删除:
>>> Publisher.objects.all().delete()
如果只需要删除部分的数据,就不需要调用all()方法。再看一下之前的例子:
>>> Publisher.objects.filter(country='USA').delete()

本文参考资料:http://djangobook.py3k.cn/2.0/chapter05/

你可能感兴趣的:(04 django之ORM操作)