ORM

db first和code first
Django的ORM也是code first
1创建类
  1根据类自动创建数据库表
  2根据类对数据库表中的数据进行各种操作

 a. 先写类
from django.db import models
class UserInfo(models.Model):

# id列,自增,主键
# 用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)  必须指定长度
ip = models.IntegerField(此字段不能指定长度)

b. 注册APP

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
c. 执行命令
python manage.py makemigrations
python manage.py migrate

d. ********** 注意 MySQL操作***********
1Django默认使用MySQLdb模块链接MySQL
主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
import pymysql
pymysql.install_as_MySQLdb()
2在settings中更改数据库的配置
DATABASES = {

    'default': {
    'ENGINE''django.db.backends.mysql',
    'NAME':'dbname',
    'USER''root',
    'PASSWORD''xxx',
    'HOST': '',
    'PORT': '',
    }
}
 

创建外键时必须写on_delete参数  b = models.ForeignKey(to='Business',to_field='id',on_delete=models.CASCADE)
Django创建主键时必须写自增      nid = models.AutoField(primary_key=True)
新增一列  code = models.CharField(max_length=32)
1 在terminal中选1,
  Please select a fix:1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
  2) Quit, and let me add a default in models.py
2 code = models.CharField(max_length=32,null=True)  
3 code = models.CharField(max_length=32,default=‘sa’ )

查一个元素  models.Business.objects.get(id=1) 没有就报错  models.Business.objects.filter(id=1).first()

v1 = models.Host.objects.all()  # QuerySet ,内部元素都是对象,row.id  html中{{row.id}}跨表用点.
v2 = models.Host.objects.all().values('nid','b_id','b__caption')   # QuerySet ,内部元素都是字典, row['id']  html中{{row.id}}跨表用双下划线  b__caption 
v3 = models.Host.objects.filter(nid__gt=0).values_list('nid','b_id','b__caption') # QuerySet ,内部元素都是元组,row[0]  html中{{row.0}}跨表用双下划线  b__caption 
all()和filter()没影响

 

 

 

多对多:
创建多对多:
方式一:自定义关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
# 2

class HostToApp(models.Model):
hobj = models.ForeignKey(to='Host',to_field='nid')
aobj = models.ForeignKey(to='Application',to_field='id')

# HostToApp.objects.create(hobj_id=1,aobj_id=2)

方式二:自动创建关系表
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32,db_index=True)
ip = models.GenericIPAddressField(protocol="ipv4",db_index=True)
port = models.IntegerField()
b = models.ForeignKey(to="Business", to_field='id')
# 10
class Application(models.Model):
name = models.CharField(max_length=32)
r = models.ManyToManyField("Host")

无法直接对第三张表进行操作

obj = Application.objects.get(id=1)
obj.name

# 第三张表操作
obj.r.add(1)
obj.r.add(2)
obj.r.add(2,3,4)
obj.r.add(*[1,2,3,4])

obj.r.remove(1)
obj.r.remove(2,4)
obj.r.remove(*[1,2,3])

obj.r.clear()

obj.r.set([3,5,7])

# 所有相关的主机对象“列表” QuerySet
obj.r.all()

 

 

posted @ 2018-01-22 14:00  Andy__li  阅读(98)  评论(0)    收藏  举报