当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 模型进阶

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:15

按字母顺序。 那么,使用order_by() 这个方法就可以搞定了。>>> Publisher.objects.order_by("name")[<Publisher: Apress>, <Publisher: O'Reilly>]跟以前的 all() 例子差不多,SQL语句里多了指定排序的部分:SELECT id, name, address, city, state_province, country, websiteFROM books_publisherORDER BY name;我们可以对任意字段进行排序:>>> Publisher.objects.order_by("address")[<Publisher: O'Reilly>, <Publisher: Apress>]>>> Publisher.objects.order_by("state_province")[<Publisher: Apress>, <Publisher: O'Reilly>]如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以了,如下:>>> Publisher.objects.order_by("state_province", "address") [<Publisher: Apress>, <Publisher: O'Reilly>]我们还可以指定逆向排序,在前面加一个减号 - 前缀:>>> Publisher.objects.order_by("-name")[<Publisher: O'Reilly>, <Publisher: Apress>]尽管很灵活,但是每次都要用 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']现在,让我们来接触一个新的概念。 class Meta,内嵌于 Publisher 这个类的定义中(如果 class Publisher是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项。 在 附录B 中有 Meta 中所有可选项的完整参考,现在,我们关注 ordering 这个选项就够了。 如果你设置了这个选项,那么除非你检索时特意额外地使用了 order_by(),否则,当你使用 Django 的数据库 API 去检索时,Publisher对象的相关返回值默认地都会按 name 字段排序。连锁查询我们已经知道如何对数据进行过滤和排序。 当然,通常我们需要同时进行过滤和排序查询的操作。 因此,你可以简单地写成这种“链式”的形式:>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")[<Publisher: O'Reilly>, <Publisher: Apress>]你应该没猜错,转换成SQL查询就是 WHERE 和 ORDER BY 的组合:SELECT id, name, address, city, state_province, country, websiteFROM books_publisherWHERE country = 'U.S.A'ORDER BY name DESC;限制返回的数据另一个常用的需求就是取出固定数目的记录。 想象一下你有成千上万的出版商在你的数据库里, 但是你只想显示第一个。 你可以使用标准的Python列表裁剪语句:>>> Publisher.objects.order_by('name')[0]<Publisher: Apress>这相当于:SELECT id, name, address, city, state_province, country, websiteFROM books_publisherORDER BY nameLIMIT 1;类似的,你可以用Python的range-slicing语法来取出数据的特定子集:>>> Publisher.objects.order_by('name')[0:2]这个例子返回两个对象,等同于以下的SQL语句:SELECT id, name, address, city, state_province, country, websiteFROM books_publisherORDER BY nameOFFSET 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]更新多个对象在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。例如说我们现在想要将Apress Publisher的名称由原来的”Apress”更改为”Apress Publishing”。若使用save()方法,如:>>> p = Publisher.objects.get(name='Apress')>>> p.name = 'Apress Publishing'>>> p.save()这等同于如下SQL语句:SELECT id, name, address, city, state_province, country, websiteFROM books_publisherWHERE name = 'Apress';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;(注意在这里我们假设Apress的ID为52)在这个例子里我们可以看到Django的save()方法更新了不仅仅是name列的值,还有更新了所有的列。 若name以外的列有可能会被其他的进程所改动的情况下,只更改name列显然是更加明智的。 更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法: 示例如下:>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')与之等同的SQL语句变得更高效,并且不会引起竞态条件。UPDATE books_publisherSET name = 'Apress Publishing'WHERE id = 52;update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录。 以下示例演示如何将所有Publisher的country字段值由’U.S.A’更改为’USA’:>>> Publisher.objects.all().update(country='USA')2update()方法会返回一个整型数值,表示受影响的记录条数。 在上面的例子中,这个值是2。删除对象删除数据库中的对象只需调用该对象的delete()方法即可:>>> p = Publisher.objects.get(name="O'Reilly")>>> p.delete()>>> Publisher.objects.all()[<Publisher: Apress Publishing>]同样我们可以在结果集上调用delete()方法同时删除多条记录。这一点与我们上一小节提到的update()方法相似:>>> Publisher.objects.filter(country='USA').delete()>>> Publisher.objects.all().delete()>>> Publisher.objects.all()[]删除数据时要谨慎! 为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。 比如,下面的操作将会出错:>>> Publisher.objects.delete()

上一页  [1] [2] [3] [4] [5] [6] [7] [8]  下一页


Django 模型进阶