前面我们学习了模板,今天我们来学习模型。在Django中,数据库操作是非常简单的,这一节我们使用sqlite3来作为数据库。
首先打开models.py:添加下面的代码:
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()
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
首先创建了3个模型,也就是对应着数据库的3个表。
接下来打开cmd命令:
分别输入下面的两行代码,就可以将数据库同步了。
python manage.py makemigrations
python manage.py migrate
这样就实现了数据库同步操作。
比如打开终端输入:
>>> 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>]
我们获取数据只有看到对象的地址,我们需要操作,添加如下代码:
def __unicode__(self):
return self.name
这样就实现了人性化操作。
在进行数据库操作的过程中,有很多的技巧:
我们很少会一次性从数据库中取出所有的数据;通常都只针对一部分数据进行操作。 在Django API中,我们可以使用filter()
方法对数据进行过滤。在实际使用过程中,有很多的方法可以用,这里就不详述了。
如果对数据库进行操作,用一条一条的语句来实现,是特别麻烦的事。这可以使用Admin站点管理,来实现。
打开admin.py,添加如下代码:
admin.site.register(Publisher)
admin.site.register(Author)
admin.site.register(Book)
运行项目,得到下面的页面:
这样就实现了admin的管理。
由于昨天比较懒,于是只完成了一部分的Django的学习,今天学习最重要的Django内容—表单。从Google的简朴的单个搜索框,到常见的Blog评论提交表单,再到复杂的自定义数据输入接口,HTML表单一直是交互性网站的支柱。 本章介绍如何用Django对用户通过表单提交的数据进行访问、有效性检查以及其它处理。 与此同时,我们将介绍HttpRequest对象和Form对象。
def search_form(request):
return render_to_response('search_form.html')
对应的html文件就是:
Search
这里只有一个文本框,需要我们输入值,但我们还没有添加form指向的search方法,因此会报出404的错误。
我们添加下面的url映射以及方法。
def search(request):
if 'q' in request.GET:
message = 'You searched for: %r' % request.GET['q']
else:
message = 'You submitted an empty form.'
return HttpResponse(message)
这样就可以收到浏览器发过来的请求了。
下面我们要来实现从数据库中读取数据来显示出来。
def search(request):
if ‘q’ in request.GET:
q = request.GET[‘q’]
books = Book.objects.filter(title__icontains=q)
return render_to_response(‘search_results.html’, {‘books’: books, ‘query’: q})
else:
return HttpResponse(‘Please submit a search term.’)
对应的html文件为:
<p>You searched for: <strong>{{ query }}</strong></p>
{% if books %}
<p>Found {{ books|length }} book{{ books|pluralize }}.</p>
<ul>
{% for book in books %}
<li>{{ book.title }}</li>
{% endfor %}
</ul>
{% else %}
<p>No books matched your search criteria.</p>
{% endif %}
这样就实现了简单的数据查询效果。
在实际开发过程中,大家都需要进行手机客户端的访问,这时候就需要网站提供一些api给手机调用,今天给大家演示一下简单的应用。
def showImage(request):
imgData = open('lena.jpg', 'rb').read()
return HttpResponse(imgData, content_type='image/jpg')
这时候就可以用网页或手机登录该网站,就可以实现啦。明天开始写关于restful的api使用。