django学习记录

django学习

==========================================================

1、上传文件:

(1)、 Django model中数据批量导入bulk_create()

http://www.cnblogs.com/ccorz/p/Django-model-zhong-shu-ju-pi-liang-dao-rubulkcreat.html

http://www.cnblogs.com/CQ-LQJ/p/5089047.html

(2)、上传excel文件存入数据库时,可以不用存入硬盘,而直接读取内存中的数据流。

xlrd api中:xlrd.open_workbook(filename=None,file_contents=None),如果设置了file_contents,filename便不起作用。

如下:

class Upload(object):
    u'''文件上传类,接受excel,csv文件'''
    
    def __init__(self,filename=None,file_contents=None):
        self.filename = filename
        self.file_contents = file_contents
        
    def get_data(self):
        '''返回数据'''
        try:
            import xlrd
            #filename读取文件名。file_contents=读取内存中的文件流
            wb = xlrd.open_workbook(filename=self.filename,file_contents=self.file_contents)
            ws = wb.sheets()[0]
            data = [ws.row_values(i) for i in range(ws.nrows)][2:]
            return data
        except:
            return "xlrd is not exists!"

#使用
  data = Upload(file_contents=req.FILES['subfile'].read())
  print data.get_data()

(3)、对上传的excel文件进行校验。

def validate_excel(value):
    """自定义验证内容"""
    if value.name.split('.')[-1] not in ['xls','xlsx']:
        raise ValidationError(gettext('文件类型错误: %(value)s'),params={'value': value},)

class UpSub(models.Model):
    subfile = models.FileField(u"文件名称",help_text=u"只能上传excel文件",validators=[validate_excel]) #这里使用自定义的验证
        
    class Meta:
        verbose_name = u'批量上传变电站'
        verbose_name_plural = u'批量上传变电站'

(4)、使用 get_or_create(),返回一个元组,第一个参数为get or create 的obj,第二个参数为 create的布尔值,新建数据为True,反之为False。

(5)、如何让admin页面中app按一定顺序显示。由于django的app是按名称顺序,但中文不同于英文名称。处理方法,在app的verbose_name前加入序号。如:

verbose_name = u'变电站'
verbose_name_plural = u'1、变电站'

verbose_name = u'2、线路'
verbose_name_plural = u'2、线路'

其中,verbose_name 为change_list中的app名称,verbose_name_plural为app_list中显示的名称,效果如下:

 2、改变admin中app显示的名称

(1),打开该app文件夹的__init__.py 文件,输入:

default_app_config = 'train.apps.TrainConfig'

(2),打开该apps.py文件,输入:(verbose_name即为你要显示的名字,前面加序号可以排序)

#coding:utf-8
from django.apps import AppConfig

class TrainConfig(AppConfig):
name = "train"
verbose_name = u"培训"

(3)效果:

 

 

 

 

 

===========================================手动输入的分割线==================================================

2、单独使用django的orm

  (1)mytest.py

# -*- coding: utf-8 -*-

from django.db import models
from django.conf import settings
import django

#外部调用django时,需要设置django相关环境变量

#设置INSTALLED_APPS信息
INSTALLED_APPS = [
    'mytest',
]
#设置数据库信息
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',   #mysql的engine
        'NAME': 'plant',                        #数据库名称
    }
}
#给Django配置相关信息
settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
#启动Django
django.setup()

#构造ORM的对象
class Animal_json(models.Model):
    name = models.CharField(db_column=u'name', max_length=512, primary_key=True)
    data_json = models.TextField(db_column=u'data_json')

    def __unicode__(self):
        return self.name

  (2)在数据中定义field。

  (3)test.py

#coding:utf-8
from mytest import Animal_json

an = Animal_json(name=u"测试1",data_json=u"这是测试1")
an.save()

an = Animal_json(name=u"测试2",data_json=u"这是测试2")
an.save()


animals = Animal_json.objects.all()

for i in animals:
    print i.name," --> ",i.data_json

  (4)、运行测试

 

posted @ 2017-08-28 13:14  daivlin  阅读(199)  评论(0编辑  收藏  举报