刨食的兔子 2016-08-29
Django支持sqlite3, MySQL, PostgreSQL等数据库,如果不设置,默认使用sqlite数据库
1,创建项目,名为sqliteTest
在项目中创建一个应用,名为sqTest
django-admin startproject sqliteTest cd sqliteTest/ django-admin startapp sqTest
2,将新建的应用添加到项目下的sqliteTest文件夹中的settings.py中,告诉Django有sqTest这个应用
setting.py中有一个属性INSTALLED_APPS,将sqTest填入。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ‘sqTest’ ]
3,在sqTest文件夹的models中添加需要的数据的类。比如我需要一些NBA球员的数据,所以我创建一个Player类,里面包含几个属性,分别为姓名,年龄,位置,号码。其中,CharField表示该属性应该为一个字段,IntegerField表示该属性为一个整数。max_length表示最大长度。
class Player(models.Model): name = models.CharField(max_length=30) age = models.IntegerField() position = models.CharField(max_length=10) number = models.IntegerField()
4,在终端中输入
python manage.py makemigrations python manage.py migrate
输入之后会自动生成models中的数据表,比如刚才的Player类,此时生成了一个Player表。可以通过终端,django自带的数据库管理后台等方式查看。
5,终端查看
使用python manage.py shell进入命令行,之后读取Player
>>> Player.objects.all() <QuerySet []> >>> Player.objects.create(name="Curry", age=28, position="G", number=30) <Player: Player object>
第一次使用Player.objects.all()命令查看Player中的所有数据时,因为没有写入过,所以为空。
使用create创建一个球员Curry,再次查看,出现<Player: Player object>。但是此时打印出来的数据可读性不强,所以退出命令行,在model中添加一个__str__方法,增加可读性。
def __str__(self): return self.name
此时再次进入命令行,读取Player
>>> from sqTest.models import Player >>> Player.objects.all() <QuerySet [<Player: Curry>]>
输出时出现了数据的名字,可读性增强。
6,添加数据库,除了上面一种方法,还有两种方法创建。
(1)创建一个Person类的实例,给实例的属性赋值,最后使用save()方法将实例存入数据库。
>>> player = Player(name="Durant") >>> player.age = 28 >>> player.position = "F" >>> player.number = 35 >>> player.save() >>> Player.objects.all() <QuerySet [<Player: Curry>, <Player: Durant>]>
(2)使用get_or_create创建,防止重复,如果插入相同的,会失败。如果如果只用create,会使表中有两个相同的数据
>>> Player.objects.get_or_create(name="Curry", age=28, position="G", number=30) (<Player: Curry>, False)
7,获取对象
(1),获取该数据表所有数据:
>>> Player.objects.all()
(2),get方法,只能获取一个值,如果获取的值有两个,会失败
>>> Player.objects.get(name="Durant") <Player: Durant> >>> Player.objects.get(age=28) sqTest.models.MultipleObjectsReturned: get() returned more than one Player -- it returned 2!
age为28的有两个,所以第二次获取失败。
(3),filter筛选多个
>>> Player.objects.filter(age=28) <QuerySet [<Player: Curry>, <Player: Durant>