最近是学了有关用pyamf来连接python和django的东东,所以把自己的一些学习的步骤与体会记下来。环境:python-2.7 django-1.5 pyamf-0.6
第一部分:先建立一个admin,这个就按照<>的步骤来做好了.
建好的工程和app
新建一个数据库onetest,我用的是postgresql数据库
把数据库设置一下在setting中
然后也是在setting中添加app:
在url.py中
models中
1 #encoding=utf-8
2 from django.db importmodels3
4
5 #定义出版商
6 classPublisher(models.Model):7 #主键,id自增
8 id=models.AutoField(primary_key=True)9 #名字
10 publisher_name = models.CharField( max_length=30 ,verbose_name = "名字")11 #地址
12 publisher_address = models.CharField( max_length=50,verbose_name = "地址")13 #email
14 psublisher_email = models.EmailField(blank=True)15 #禁用
16 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用")17
18 def __unicode__(self):19 returnself.publisher_name20
21 classMeta:22 verbose_name = "出版商"
23 verbose_name_plural = "出版商"
24
25
26 #定义作者
27 classAuthor(models.Model):28 #主键,id自增
29 id=models.AutoField(primary_key=True)30 #名字
31 author_name = models.CharField(max_length=30 ,verbose_name = "名字")32 #地址
33 author_address = models.CharField(max_length=50,verbose_name = "地址")34 #email
35 author_email = models.EmailField(blank=True)36 #禁用
37 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用")38
39 def __unicode__(self):40 returnself.author_name41
42 classMeta():43 verbose_name = "作者"
44 verbose_name_plural = "作者"
45
46
47 #定义书本
48 classBook(models.Model):49 #主键,id自增
50 id=models.AutoField(primary_key=True)51 #名字
52 book_name = models.CharField( max_length=30 ,verbose_name = "书名")53 #书作者
54 books_author = models.ManyToManyField(Author, related_name="book_author_r")55 #书出版商
56 book_publisher = models.ForeignKey(Publisher,related_name="book_publisher_r")57 #禁用
58 enable = models.IntegerField(default=0,blank=True,verbose_name = "禁用")59
60 def __unicode__(self):61 returnself.book_name62
63 classMeta():64 verbose_name = "书本"
65 verbose_name_plural = "书本"
在testapp中新建一个admin.py文件
1 # encoding=utf-8
2 fromdjango.contrib import admin3 from models import *
4
5 admin.site.register(Book)6 admin.site.register(Author)7 admin.site.register(Publisher)
在命令行输入manage.py syncdb
浏览器:(中文显示可以在setting里的LANGUAGE_CODE=‘en-us’换为'zh-CN')
在testapp下建立gateway.py和publisher_action.py
publisher_action.py:
1 #encoding=utf-8
2 fromdjango.db import transaction3 fromdjango.conf import settings4 import models5
6 import logging7
8
9
10 infoLog = logging.getLogger("info")11 errorLog = logging.getLogger("error")12 debugLog = logging.getLogger("debug")13
14 '''15 接口16 "publisher_name"=publisher_name,17 "publisher_address"=publisher_address,18 "publisher_email"=publisher_email,19 "enable"=enable,20 '''21
22 #新增publisher23 def insert(data ={}):24 try:25 model = models.Publisher(publisher_name=data.get("publisher_name"), publisher_address=data.get("publisher_address"), publisher_email=data.get("publisher_email"),enable=data.get("enable"))26 if model.enable ==None:27 model.enable=0
28 model.save()29 returnmodel.id30 except Exception,e:31 errorLog.error(e.message)32 returne33
34 #修改Publisher35 def update(data ={}):36 try:37 try:38 model = models.Publisher.objects.get(id=data.get("id"))39 except Exception,ge:40 errorLog.error(ge.message)41 return 0
42 model.publisher_name=data.get("publisher_name")43 model.publisher_address=data.get("publisher_address")44 model.publisher_email=data.get("publisher_email")45 model.enable=data.get("enable")46 if model.enable ==None:47 model.enable=0
48 model.save()49 returnmodel.id50 except Exception,e:51 errorLog.error(e.message)52 returnNone53
54 #删除Publisher55 @transaction.commit_manually56 def delete(datas =[]):57 try:58 transaction.savepoint()59 try:60 for data indatas:61 model = models.Publisher.objects.get(id=data.get("id"))62 model.delete()63 transaction.commit()64 returnlen(datas)65 except Exception,de:66 transaction.rollback()67 errorLog.error(de.message)68 return 0
69 returnTrue70 except Exception,e:71 errorLog.error(e.message)72 return None
gateway:
1 #encoding=utf-8
2 frompyamf.remoting.gateway.django import DjangoGateway3 import publisher_action4 import book_action5
6
7 services ={8 "publisher_action.insert":publisher_action.insert,9 "publisher_action.update":publisher_action.update,10 "publisher_action.delete":publisher_action.delete,11
12 }13
14 recGW = DjangoGateway(services, expose_request=False, debug=True)15 recGW.timezone_offset = 8 * 60 * 60
测试testing:
1 # encoding=utf-8
2 import logging3
4 logging.basicConfig(5 level=logging.DEBUG,6 format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s'
7 )8
9 frompyamf.remoting.client import RemotingService10
11 url = 'http://127.0.0.1:8000/gateway/'
12 gw = RemotingService(url, logger=logging)13 service = gw.getService('publisher_action')14
15 def insert():16 print service.insert({"publisher_name":"xx","publisher_address":"xx","publisher_email":"123@123.com","enable":"0"})17
18 insert()
运行testing就可以在admin中的publisher看到新增的字段。
在testapp中新建一个book_action:
1 # encoding=utf-8
2 fromdjango.db import transaction3 fromdjango.conf import settings4 import models5 frommodels import Author6 frommodels import Book7 frommodels import Publisher8
9 import logging10
11 infoLog = logging.getLogger("info")12 errorLog = logging.getLogger("error")13 debugLog = logging.getLogger("debug")14
15 '''16 接口17 "book_name"=book_name,18 "books_author"=books_author,19 "book_publisher"=book_publisher,20 "enable"=enable,21 '''22
23 #新增publisher24 def insert(data ={}):25 try:26 model = models.Book( book_name=data.get("book_name"),book_publisher_id=data.get("book_publisher_id"),enable=data.get("enable"))27 if model.enable ==None:28 model.enable=0
29 model.save()30
31 a = Author.objects.get(id=data.get("books_author_id_1"))32 c = Author.objects.get(id=data.get("books_author_id_2"))33 b = Book.objects.get(id =model.id)34 b.books_author.add(a)35 b.books_author.add(c)36
37 returnmodel.id38 except Exception,e:39 errorLog.error(e.message)40 return e
testing修改为:
1 # encoding=utf-8
2 import logging3
4 logging.basicConfig(5 level=logging.DEBUG,6 format='%(asctime)s %(levelname)-5.5s [%(name)s] %(message)s'
7 )8
9 frompyamf.remoting.client import RemotingService10
11 url = 'http://127.0.0.1:8000/gateway/'
12 gw = RemotingService(url, logger=logging)13 service = gw.getService('book_action')14
15 def insert():16 print service.insert({"book_name":"xx","book_publisher_id":"1","books_author_id_1":"3","books_author_id_2":"4","enable":"0"})17
18 insert()
运行testing,这样就可以看到新增的book字段与author有多对多的关系。可能页面会出现bug,重开浏览器就不会了。