python27+django1.9添加api

时间:2024-09-05 08:37:32

我们进入Python的交互 shell 并使用Django提供的API。要进入Python shell,使用python manage.py shell

使用这个而不是简单的输入"python",是因为 manage.py 会帮你创建项目的环境。“创建项目环境”包括两件事:
  • 把polls添加到sys.path里。为了灵活性,Django中的模块通过加点的路径来引用(例如'polls.models')。为了实现这个,polls包必须在sys.path里。
    我们已经遇到过一个这样的例子了:the INSTALLED_APPS设置里的列表就是使用点路径表示法。
  • 设置DJANGO_SETTINGS_MODULE环境变量,为Django指定了你的settings.py文件的路径。

省略manage.py

在shell里面时,可以 探索 下database API,这招可以用来检验刚才的模型是否可以正确调用数据库
>>> from polls.models import Poll, Choice # 导入我们刚写的模型。
# 系统里还没有poll。
>>> Poll.objects.all()
[]
# 创建一个新poll。
>>> import datetime
>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now())
# 把对象保存进数据库里。你需要明确调用save()。
>>> p.save()

from start.models import Start
Start.objects.all()
import datetime
p = Start(question="What's up?", pub_date=datetime.datetime.now())
p.save()

也就是上面这个代码框的内容,依次输入处理即可,无论提示什么,只要数据库里生成表,基本就是成功了

# 现在它有个ID了。注意这里也可能显示1L而不是1,
# 取决于你使用的是什么数据库。不过这没什么打不了,
# 它只是表明数据库更倾向于把整型返回成Python的长整型对象。
>>> p.id
1
# 通过Python属性访问数据库列
>>> p.question
"What's up?"
>>> p.pub_date
datetime.datetime(2007, 7, 15, 12, 00, 53)
# 通过修改属性来修改值,然后调用save()。
>>> p.pub_date = datetime.datetime(2007, 4, 1, 0, 0)
>>> p.save()
# objects.all()显示数据库所有的poll。
>>> Poll.objects.all()
[<Poll: Poll object>]等等。 <Poll: Poll object> 完全不能表现出这个对象的 有用信息 。我们可以编辑poll模型(在文件 polls/models.py 里)添加一个__unicode__() 方法 给 Poll 和 Choice 来解决这个问题:
class Poll(models.Model):
# ...
def __unicode__(self):
return self.question
class Choice(models.Model):
# ...
def __unicode__(self):
return self.choice为你的模型添加__unicode__()方法是很有必要的。不仅是为了让你自己更好理解交互提示,而且因为对象的表现的使用会贯穿于整个Django自动产生的admin。
为什么是__unicode__()而不是__str__()?

如果你熟悉Python的话,你可能会更喜欢在你的类里添加__str__()而不是__unicode__()方法。我们这里使用__unicode__()是因为Django模型默认使用Unicode,所有保存在数据库的数据在返回的时候都会转化成Unicode。

Django模型有一个默认的__str__()方法叫__unicode__(),它会把结果集转化成UTF-8字节字符串。在各个意味着unicode(p)会返回一个Unicode字符串,而str(p)会返回一个普通的UTF-8编码的字符串。

如果你还是觉得莫名其妙的话,记得把__unicode__()方法加进你的模型中就行了,幸运的话,一切都会如你所想工作。

注意这些都是普通的Python方法,让我们添加一个自定义的方法,用作示范:
import datetime
# ...
class Poll(models.Model):
# ...
def was_published_today(self):
return self.pub_date.date() == datetime.date.today()添加 import datetime 会引用Python的 datetime 模块。 保存这些修改然后再次运行 python manage.py shell 新开一个Python交互shell:
>>> from polls.models import Poll, Choice
# 确保我们新加的__unicode__()正常工作。
>>> Poll.objects.all()
[<Poll: What's up?>]
# Django提供了丰富的数据库查找API,
# 这些API完全由关键字参数驱动。
>>> Poll.objects.filter(id=1)
[<Poll: What's up?>]
>>> Poll.objects.filter(question__startswith='What')
[<Poll: What's up?>]
# 获取年份为2007的poll。
>>> Poll.objects.get(pub_date__year=2007)
<Poll: What's up?>
>>> Poll.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Poll matching query does not exist.
# 通过主键查找是很常用的一种方式,
# 所以Django为这种查找方法提供一个便捷的方式。
# 下面相当于Poll.objects.get(id=1)。
>>> Poll.objects.get(pk=1)
<Poll: What's up?>
# 确认我们的自定义方法正常工作。
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_today()
False
# 给Poll加上几个Choice。
# 调用创建函数创建choice对象,会调用INSERT语句,
# 把choice添加到已存choice的集合里,并返回这个新创建的Choice对象。
# Django会创建一个集合保存外键关联,这个集合可以通过API进行访问。
>>> p = Poll.objects.get(pk=1)
# 显示关联的所有choice —— 目前还没有。
>>> p.choice_set.all()

还剩一些懒得搬运了,请参见http://blog.****.net/yelbosh/article/details/7530984