Django 同步Mysql

Django结合Mysql进行开发指导

笔记整理来自此教程

1、在models.py中建立一个class

1
2
3
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()

2、配置settings.py

1
2
3
4
5
6
7
8
9
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'root',
'PASSWORD': 'nhce111',
'HOST': '127.0.0.1',
}
}

3、同步数据库

1
2
3
4
python manage.py makemigrations
python manage.py migrate
#如果是针对某一个app的话,同步命令应该事:
python manage.py makemigrations appname

同步之后,django会根据我们在modles中的class建立一个表,比如people_person

4、对表进行操作

1
2
3
4
5
6
7
8
9
10
11
$ python manage.py shell

>>> from people.models import Person
>>> Person.objects.create(name="WeizhongTu", age=24)
<Person: Person object>
>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
'''创建新对象'''
>>>Person.objects.create(name="cc", age=24)
'''获取新对象'''
>>>Person.objects.get(name="cc")

记得修改models

1
2
3
4
5
6
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()

def __unicode__(self):
return self.name
# 5、创建一个对象的方法有以下几种:

1、一步到位

1
Person.objects.create(name=name,age=age)

2、分2个步骤进行

1
2
p = Person(name="WZ", age=23)  
p.save()

3、面向对象

1
p = Person(name="TWZ") p.age = 23 p.save()

4、get_or_create方法

1
2
>>> Person.objects.get_or_create(name="WZT", age=23)
(<Person: WZT>, True)

这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

6、获取单个对象有以下方法

1、Person.objects.all()

获取所有

1
2
3
>>> Person.objects.all()
[<Person: WeizhongTu>, <Person: AA>, <Person: BB>, <Person: cc>, <Person: QQE>,
<Person: qq>, <Person: WZT>]
## 2、Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

1
2
>>> Person.objects.all()[:3]
[<Person: WeizhongTu>, <Person: AA>, <Person: BB>]

3、Person.objects.get(name=name)

get 是用来获取一个对象的,必须严格符合条件才行。

4、Person.objects.filter()

如果需要获取满足条件的一些人,就要用到 filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") # 名称严格等于 "abc" 的人,区分大小写。
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件。
[<Person: ABC>]
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人,且abc区分大小写。
Person.objects.filter(name__contains="q")
[<Person: qq>]
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写。
Person.objects.filter(name__icontains="q")
[<Person: QQE>, <Person: qq>]
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__regex="T$")
[<Person: WZT>]
Person.objects.filter(name__regex="^q")
[<Person: qq>]
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
Person.objects.filter(name__iregex="^q")
[<Person: QQE>, <Person: qq>]
## 5、Person.objects.exclude() filter是找出满足条件的,当然也有排除符合某条件的,就要用到 exclude

1
2
3
Person.objects.exclude(name__contains="WZ")   # 排除包含 WZ 的Person对象。
Person.objects.filter(name__contains="AA").exclude(age=10) # 找出名称含有AA, 但是排除年龄是10岁的
[<Person: AAB>]

7、获取到数据库的所有对象

QuerySet 是查询到数据库的所有对象

1、Person.objects.all()

QuerySet 是查询所有的 Person条目。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> from people.models import Person
>>> es = Person.objects.all()
>>> for e in es: # 可迭代
... print e
...
WeizhongTu
AA
BB
cc
QQE
qq
WZT
AAB
## 2、 Person.objects.all().exists() 如果只是检查 Entry 中是否有对象,应该用 Person.objects.all().exists()
1
2
>>> Person.objects.all().exists()
True
## 3、QuerySet 支持切片 Person.objects.all()[:6] 取出6条,可以节省内存。
1
2
3
>>> Person.objects.all()[:6]
[<Person: WeizhongTu>, <Person: AA>, <Person: BB>, <Person: cc>, <Person: QQE>,
<Person: qq>]
## 4、获得查询结果的数量 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,因为后者用的是SQL:SELECT COUNT(*)。
1
2
3
4
>>> len(es)
8
>>> Person.objects.count()
8
## 5、 list(es) 可以强行将 QuerySet 变成列表
1
2
3
4
5
>>> list(es)
[<Person: WeizhongTu>, <Person: AA>, <Person: BB>, <Person: cc>, <Person: QQE>,
<Person: qq>, <Person: WZT>, <Person: AAB>]
>>> type(es)
<class 'django.db.models.query.QuerySet'>
## 6、QuerySet 查询结果排序

作者按照名称排序

1
2
3
4
>>> Author.objects.all().order_by('name')
[<Author: Wei>, <Author: WeizhongTu>]
>>> Author.objects.all().order_by('-name')
[<Author: WeizhongTu>, <Author: Wei>]
## 7、QuerySet 支持链式查询
1
2
>>> Person.objects.filter(name__contains="A").exclude(age=12)
[<Person: AA>]

8、 QuerySet 重复的问题

使用 QuerySet.distinct() 去重

一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可以会出来重复的值

1
2
3
4
5
6
7
8
9
qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='WeizhongTu')

# 合并到一起,这个时候就有可能出现重复的。
qs = qs1 | qs2 | qs3

# 去重方法
qs = qs.distinct()


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!