肥嘟嘟(Fatbobman)的学习笔记Rss Feed

上学的时候懒不愿意做笔记,但确实了解笔记的重要性。现在想做笔记了,但是还是懒,当然对于重要性的认识丝毫没有动摇。

2005/10/28

Django's model 参考(三)

Model methods
    __repr__
    get_absolute_url
    如何表现对象的url
        def get_absolute_url(self):
            return "/pizzas/%i/" % self.id

    _pre_save
        内容数据库保存前需要做的事情。比如可以对某些字段进行计算等
    _post_save 保存后做的。比如处理其他相关数据表
    _pre_delete
    _post_delete

Module-level methods
    通过在method名字前面加_module_可以定义module-level的methods
    class Pizza(meta.Model):
        def _module_get_pizzas_to_deliver():
            return get_list(delivered__exact=False) #__exact 相当于==  __ne相当于!= 比较奇怪的用法
   
>>> from django.models.pizza_hut import pizzas
>>> pizzas.get_pizzas_to_deliver()
[ ... ]

Manipulator methods
通过在method前面加上_manipulator_定义。用来自定义字段检验。使用相应validate事会自动调用


class Pizza(meta.Model):
# ...

def _manipulator_validate_customer_id(self, field_data, all_data):
from django.core import validators
from django.conf.settings import BAD_CUSTOMER_IDS

if int(field_data) in BAD_CUSTOMER_IDS:
raise validators.ValidationError, "We don't deliver to this customer."

使用 models
    django-admin.py startapp 创建
   
myapp/
__init__.py # Empty file
models/
__init__.py # Contains "__all__ = ['mymodels']"

mymodels.py # Contains your models
   
    在setting 中的 INSTALLED_APPS 加上 mymodels

Django's model 参考(二)

关系数据库
    Django可以支持关系数据库中的表结构的多对一、多对多、一对一多种方式。

多对一
    使用ForeignKey

    class City(meta.Model):
        #....
    class Place(meta.Model):
        #....
        city = meta.ForeignKey(City)

    通常情况下,ForeignKey中应该是对应的Model的名字,实际上系统会使用对应Model的_id来维持这个关系。
    使用 meta.ForeignKey("self") 尽兴递归性的多对一

    ForeignKey 参数:
    edit_inline 如果为否,不可在admin模式下编辑。
    limit_choices_to 使用字典来限制admin模式下的选项。
         limit_choice_to={'pub_date__lte' : meta.LazyDate()}

    max_num_in_admin
    min_num_in_admin
    num_extra_on_change
    num_in_admin
    raw_id_admin              都是用于admin模式

    related_name  设置别名
    对于一个对象相对多次关联另一个对象很有用
        meta.ForeignKey( Category, related_name="primary_story")
        meta.ForeignKey(Category, related_name="secondary_story")
       # get_primary_story_list()    get_secondary_story_list()

多对多
    ManyToManyField
    选项:
    related_name 同上
    filter_interface admin模式下使用js而不是select
    limit_choices_to 同上

一对一
      OneToOneField

META 选项  非数据库字段
    class Foo(meta.Model):
        bar = meta.CharField(maxlength=30)
        #....
        class META:
            admin = meta.Admin()
            # ....

    选项:
    admin 一个meta.Admin对象。表示是否在admin模式下可见

    db_table
        db_table="pizza_orders" 否则采用app_lable+'_'+module_name给表命名
    exceptions
        exceptions = ("aaa","bbb")   ?
   
    get_latest_by
        get_lastedt_by = "order_date"对应 一个DateField或者DateTimeField。对象将可通过get_lastest()访问

    module_constants
    一个可用于module_level使用的常量定义字典
         module_constants={'MEAT_TYPE_PEPPERONI':1,'META_TYPE_SAUSAGE':2,}

    module_name
    如果不指定。系统自动使用 小写class名+'s'

    order_with_respect_to
        order_with_respet_to = 'pizza'  根据相关对象排序。如果有关联的话

    ordering
        ordering = ['-order_date'] 真正的排序。get_list -号倒序 ?号乱序

    permissions
    使用二元数组或元组定义admin模式下permissions权限
    ((permission_code, human_readable_permission_name),)

    unique_together
    使用list of lists 定义。用于数据库创建或admin模式
    unique_together = (("driver","restaurant"),)

    verbose_name
    human-readable version
    verbose_name_plural 复数版本

Admin 选项
    date_hierarchy
         date_hierarchy='order_date'  admin通过date过滤对象

    fields
    设置用来显示的字短列表。
    [(name, field_options)] options是一个控制字段的字典。字典键值如下:
    fields 显示那些字段
    classes css设置
 
  fields = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': 'collapse',
'fields' : ('enable_comments', 'registration_required', 'template_name')
}),
),  
显示效果 
http://media.djangoproject.com/img/doc/flatfiles_admin.png
       
    js
    在admin模式下现实的一个js字符串列表

    list_display
    采用列表显示。
    list_filter 打开过滤器。布朗型或多对一
   
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff'),

list_filter = ('is_staff', 'is_superuser'),

http://media.djangoproject.com/img/doc/users_changelist.png

     ordering 排序
     save_as 另存一个新对象
     save_on_top 上方显示save
     search_fields 上图上面的searech 框

2005/10/27

Django model 参考(一)

django 中model 作为数据资源指定了字段以及一些处理该相应的功能。通常情况下,每个model对应数据库中的一张表
  • 每个model都是从django.core.meta.Model中派生出来的
  • model中每个属性(class attribute)对应着数据库表中的一个字段
  • 非字段信息(Model metadata)在类中被称作META
Field Objects
每个class attributes对应着数据库中的一个字段,其应该是由meta.Filed的派生的。

from django.core import meta
class Person(meta.Model):
    first_name = meta.CharField(maxlength=30)
    last_name = meta.CharFiled("lastname",maxlength=30)

除了 ForeignKey, ManytoManyFiled OneToOneField 使用verbose_name关键字以外,第一个可选参数是用来为字段命名的,如果不设置,系统会自动为起起名。
sites = meta.ManyToManyField(site,verbose_name="list of sites")

Field 选项

null
    null 缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField上.字符型字段如果没有值会返回空字符串。

blank
    该字段是否可以为空。如果为假,则必须有值

choices
    一个用来选择值的2维元组。第一个值是实际存储的值,第二个用来方便进行选择。
    SEX_CHOICES= (('F','Female'),('M','Male'),)

core
db_column
db_index
    如果为真将为此字段创建索引
default
    缺省值

editable
    如果为假,admin模式下将不能改写。缺省为真

help_text
    admin模式下帮助文档

primary_key
    设置主键。如果没有设置django创建表时会自动加上
    id = meta.AutoField('ID', primary_key=True)
    primary_key=True implies blank=False, null=False and unique=True. Only one primary key is allowed on an object.

radio_admin
    用于admin模式下将select转换为radio显示。只用于ForeignKey或者设置了choices

unique
    数据唯一

unique_for_date
    title =  meta.CharField(maxlength=30,unique_for_date='pub_date')
    系统将不允许title和pub_date两个都相同的数据重复出现

unique_for_month / unique_for_year

validator_list
    有效性检查。非有效产生 django.core.validators.ValidationError 错误


Field Types

AutoField
    自动增长的整型字段。通常无需自己添加

BooleanField
CharField
    对于大量文字应该使用TextField。参数: maxlength

DateField
    参数: auto_now  自动设置为对象保存时刻的时间。对于类似最后改动之类的应用很有效
    auto_now_add  从最初保存对象至今的增量时间

DateTimeField 同上
EmailField
    检查是否为email的CharField字段

FileField
    保存文件的相对路径名称
    绝对路径需要在setting中设置 MEDIA_ROOT。对于ImageField设置 MEDIA_URL。
    参数upload_to.相对于MEDIA_ROOT目录的子目录
    通过get_<fieldname>_url获取绝对路径

FilePathField
    通过给定参数获取文件列表(个人感觉)
    path 必须要有。 文件系统的绝对路径
    match 可选。一个正则表达式。用来做文件筛选过滤
    recursive 可选。True 包含子目录查找
    FilePathField(path="/home/images", match="foo.*" , recursive=True)

FloatField
    浮点数字段。两个必须选项
    max_digits 数字最多位数
    decimal_places 小数点位置
    meta.FloatField(...,max_digits=5,decimal_places=2)   /////100.00

ImageField
    基本上同FileField.会进行文件格式检查。两个额外选项
    height_field, width_field 如果设置这两项,会自动对图片进行缩放后再保存
    需要 python Imaging library

IntegerField
IPAddressField
    "10.1.1.3"

NullBooleanField
    比BooleanField多了一个NULL状态

PhoneNumberField
    美国格式电话号码 xxx-xxx-xxxx. CharField

PositiveIntegerField
    正整数

PositiveSmallIntegerField
    一个小的正整数。根据数据库的设置

SlugField
    小片断。什么都可以。通常用来存url
    SlugField 被暗指 maxlength=50 db_index=True
    选项: prepopulate_from 一个用来自动生成slug的字段列表

SmallIntegerField
TextField

TimeField
    选项: auto-population(可能不对) from DateField and DateTimeField

URLField
    选项: verify_exists  如果为True ,系统自动检查该url是否存在不为404

USStateField
    两字符美国州简写

XMLField
    保存xml数据。
    选项:schema_path .指定relaxNG格式schema用来检验xml合法性


   




   

   


Django + mysql 安装出现的问题

  打算学习以下django,不过刚开始就碰上了问题。由于配合的是mysql,所以按照其要求装了所需的各种模块。可以顺利生成myproject目录。不过init时总报错。
C:\Python24\Lib\site-packages>python django\bin\django-admin.py init --settings=
myproject.settings
Error: The database couldn't be initialized.
an integer is required
  后来发现其实只要将settings.py 中的DATABASE_PORT =  '3306'  改成 DATABASE_PORT = 3306    就可以了,虚惊一场。
    

2005/10/17

使用rico实现ajax应用的例子(1)

  关于ajax是什么已经有很多方面的介绍了。本着拿来主义的原则,选择了rico这个纯js解决方案后端配合karrigell来实现一些ajax应用。
  rico 的ajaxEngine 有多种获取、处理数据的方式。其中通过直接将xml数据与element相绑定可能是最简单的一种。
  rico中实现ajax应用通常需要分3步走:
  1. Register the Ajax request handler. This tells the AjaxEngine that a specific
    web service or server call is mapped to a request handler name.
  2. Register the Ajax response handler. This is either specifies an HTML element
    as the target of the data being returned (in which case the contents of the
    response is HTML code) or it specifies a specific JavaScript object that will
    manage the response
  3. Invoke the Ajax request when the appropriate event occurs in the interface.

  通过一个实际的例子来演示。

  客户端 ajaxtest.html

<html>
<head>
<title>AjaxTest</title>
//这两个文件是rico实现任何功能的基础,必须要有:)
<script src="/jsscripts/prototype.js"></script>
<script src="/jsscripts/rico.js"></script>
<script>
var onloads = new Array();
function bodyOnLoad() {
for ( var i = 0 ; i < onloads.length ; i++ )
onloads[i]();
}
</script>
</head>
<body onload="javascript:bodyOnLoad()">
<script>
//要在onload时完成所要注册的request、ajaxelement等物件。这个问题最初困扰了我好几个小时。
onloads.push( registerAjaxStuff );
function registerAjaxStuff()
{
//注册一个request,命名为getwords,后端处理程序为 ajaxresponse.py。如果你后端不想通过动态语言处理的话,也可以直接使用xml文件。
ajaxEngine.registerRequest('getwords','ajaxresponse.py');
//注册一个客户端显示的element, id='word' ,必须在html里面有。
ajaxEngine.registerAjaxElement('word');
}
function getword()
{
//获取数据、自动完成更新。可以调用参数,如下结构:ajaxEngine.sendRequest('getPersonInfo',"firstName=" + firstName,"lastName=" + lastName );
ajaxEngine.sendRequest('getwords');
}
</script>
<div id="word">This is a test</div>
//实际运行时会将后端获取的数据替换掉div word中的内容。后端数据可以直接包含html、css等元素,这样可以连版式调整问题一并解决。

<div ><a href="javascript:getword();">Click Here</a></div>
</body>
</html>

  服务端程序 ajaxresponse.py
import random
RESPONSE['Content-Type'] = 'text/xml'
RESPONSE['Cache-Control']='no-store' #解决ie下刷新问题

print """<?xml version="1.0" ?>
<ajax-response>
<response type="element" id="word">
<b>hello world
"""
print str(random.random())
print """</b>
</response>
</ajax-response>
"""


  后端程序生成的xml数据类似如下:
<ajax-response> <response type="element" id="word"> <b>hello world 0.208002263747</b> </response> </ajax-response>


  数据必须包含<ajax-response>.这点可能正是rico 灵活性方面的弱势吧,只能接受其规定格式的xml数据。
  每个被绑定的element 都需要一个response 返回数据。可以在程序中使用registerAjaxElement绑定多个element,每个对应xml数据中相对应id的<response>.

  这是一个很简单的例子来感受ajax所带来的变化,以及rico实现上的便捷。

2005/10/14

关于ajax应用在ie下不刷新的解决

  正在学习ajax.前端用rico ,后端karrigell.后端产生的xml是动态的,每次访问产生的结果不同。在firefox下测试没有问题,每次点击都可以获得新的数据。不过在ie下就不行了。第一次点击后的数据好像都是从catch中获取的。
  通过在pythonchinese获得帮助,通过于karrigell端设置如下语句得以解决:
  RESPONSE['Cache-Control']='no-store'
  服务端测试程序如下:
import random
RESPONSE['Content-Type'] = 'text/xml'
RESPONSE['Cache-Control']='no-store'
print """<?xml version="1.0" ?>
<ajax-response>
<response type="element" id="word">
<b>hello world
"""
print str(random.random())
print """</b>
</response>
</ajax-response>
"""
  
  ps:这篇文章是通过gmail post过来的,顺便测试一下gmail下的版式在blogspot上处理的如何。如果效果可以,以后这样写起来方便点。


学习笔记开张

  由于blogger没有提供分类,所以单独开了这个地方用来记录我在学习上面的问题、心得。