http://bio.rusaer.com/archives/280
之前搭建环境是为了更好的进行编辑,现在就进行数据的建模
1,在django里,创建数据结构相对来说十分简单,就是在创建的app网站文件夹下的models.py中定义,这里我就以简单的blog程序来做解释:models.py
from django.db import models
#导入数据库模块
class Reporter(models.Model):
#定义一个表格
full_name = models.CharField(max_length=70)
#字段名,即表头。定义为单行
def __unicode__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateTimeField()
headline = models.CharField(max_length=200)
#上下都类同
article = models.TextField()
#这个textfield就是多行,编辑文章内容用,调用编辑器也是这个
reporter = models.ForeignKey(Reporter)
#外键
def __unicode__(self):
return self.headline
# 还有好多函数,都是可以使用的,如URLField EmailField 可以参考手册
2,添加app到setting.py
选中部分就是添加的app
3,创建数据表
首先,现校验一下模型的有效性,cd转到工程目录,运行
python manage.py validate
validate 命令检查你的模型的语法和逻辑是否正确。如果一切正常,你会看到 0 errors found 消息。如果有问题,它会给出非常有用的错误信息来帮助你修正你的模型。然后再运行
python manage.py sqlall blog
sqlall 命令并没有在数据库中真正创建数据表,只是把 SQL 语句段打印出来。你可以把这些语句段拷贝到你的 SQL 客户端去执行它。
当然,Django 提供了更简单的方法来执行这些 SQL 语句。运行 syncdb 命令:
python manage.py syncdb
这样数据就创建成功了。
4,基本数据访问
python manage.py shell
>>>from blog.models import * #创建对象,import模型,传入值将其实例化
>>>p1 = Article(pub_date = ’2010/04/15′, headline=’it is a example’, article = ‘article text’, reporter = ‘admin’ )
>>>p1.save() #调用该对象的save()方法,将对象保存到数据库中,django会在后台执行insert语句。
>>>article_list = Article.objects.all() # 使用树形objects从数据库中获取对象,objects.all调用所有对象,django会在后台执行一条select sql语句。
>>>article_list
[<headline: it is a example>] #返回值,因为models.py里用return self.headline返回headline的值
数据过滤
如果想活的数据的一个子集,可以用fliter()方法:
>>>Article.object.fliter(headline=”it is a example”)
[<headline: it is a example>]
如果后面添加多个参数,则相当与sql语句中的and
>>>Article.object.fliter(headline=”it is a example”, id=1)
[<headline: it is a example>]
注意,这些操作字符都是精确匹配的,如果sql中的like %example% , 则可以用
>>>Article.object.fliter(headline__contains=”example”)
[<headline: it is a example>]
还有很多如icontains, startswith, endswith, range(sql between 查询)等,可以查看手册。
获取单个对象
如果想获取单个对象,这个时候用get()方法
>>>Article.object.get(headline=”it is a example”)
[<headline: it is a example>]
数据排序
>>>Article.object.order_by(“pub_date”)
多字段排序
>>>Article.object.order_by(“pub_date”,”headline”)
还可以进行逆向排序,在前面加一个减号-前缀
>>>Article.object.order_by(“-pub_date”)
定义缺省排序方式,
Django 使用内部类 Meta 存放用于附加描述该模型的元数据。 这个类完全可以不实现,不过他能做很多非常有用的事情
综合使用
>>>Article.object.fliter(headline__contain=”it”).order_by(“pub_date”)
限制返回的数据
>>>Article.object.all()[0]
删除对象
>>>p = Article.objects.get(id=2)
>>>p.delete()
批量删除,获取查询结果,实例化
>>>p = Article.objects.all()
>>>p.delete()
[]
5,自定义管理界面
老版本的django是直接在models.py的么个模块下自定义,新版本的则是在每个app下新建一个admin.py文件
如我的blog目录下的admin.py:
from django.contrib import admin
#导入共用的admin模块
from sites.blog.models import Reporter, Article
#导入需要进行管理的模块
from django.conf import settings
#导入设置文件
class ReporterAdmin(admin.ModelAdmin):
#定义Reporter的管理方式
list_display = (‘full_name’,)
#列表显示的内容
search_fields = (‘full_name’,)
#添加一个搜索框,以full_name为变量搜索
class ArticleAdmin(admin.ModelAdmin):
list_display = (‘pub_date’, ‘headline’, ‘article’,'reporter’)
date_hierarchy = ‘pub_date’
ordering = (‘-pub_date’,)
#按时间倒序排列
raw_id_fields = (‘reporter’,)
class Media:
js = (settings.MEDIA_ROOT+’js/tiny_mce/tiny_mce_src.js’, settings.MEDIA_ROOT+"filebrowser/js/TinyMCEAdmin.js",)
#定义textarea的js,即添加可视化编辑器
admin.site.register(Article, ArticleAdmin)
admin.site.register(Reporter, ReporterAdmin)