一、知识点url终止符/单表数据的三种方式
- url后加终止符防止正则匹配的唯一性
from django.conf.urls import url
from django.contrib import admin
from cm import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#防止截胡
url(r'^business$',views.business),
]
- 获取单表数据的三种方式
all / values / values_list
all相当于select * from 表 返回的Queryset类型,Queryset中包含的是表每一行返回的对象
# Queryset[obj(字段),obj,obj]
obj = models.表.objects.all()
#调用方法是循环出每个对象,调用他们的字段(属性)
values相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据字典的形式返回k代值字段,v代值数据
# Queryset[{caption:'测试'},{},{}]
#select caption from business
v = models.Business.objects.values('caption')
#调用循环出字典,使用字典.k 显示v
values_list相当于select 字段 from 表 返回的Queryset类型,Queryset中包含的是每一行数据元组的形式返回字段数据
# Queryset[(1,运维部),(),()]
vv = models.Business.objects.values_list('caption')
#调用的时候通过元组取值用脚标的方法
- 获取跨表数据非对象取值
两个表关联时,不用对象取值单一的取另一个表的字段时用__字段(双下滑线加字段)
host 关联business
#b__coption直接调用b对象的coption字段queryset[{'b__coption:值}]
#对应在html调用时.b__coptin
v = models.Host.objects.values('b__coption')
#被关联对象通过关联对象类名__字段
v = models.Business.objects.filter(host__nid=1).values('caption')
二、练习
(1)、创建文件夹名为cm的app文件
python manage.py startapp cm
(2)、在setting.py配置
1、创建静态文件,先创建static文件目录,在setting.py中添加static路径
STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)注:结尾逗号
2、加入cm模块为了model.py的创建
INSTALLED_APPS = ['cm']
3、配置mysql连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cmtest',
'USER':'root',
'PASSWORD':'root',
'HOST':'localhost',
'PORT':'3306',
}
}
(3)、 在__init__.py
创建数据库连接
import pymysql
pymysql.install_as_MySQLdb()
(4)、创建models.py
知识点:
创建表时会默认创建自增列id字段
创建两个表的字段关系用ForeignKey
ForeignKey的变量名实际是关联表的对象,实际字段是变量名_id
1.编写models.py
from django.db import models
# Create your models here.
class Business(models.Model):
#id不写默认自增
caption = models.CharField(max_length=32)
class Host(models.Model):
nid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32, db_index=True)
ip = models.GenericIPAddressField(db_index=True)
port = models.IntegerField()
b = models.ForeignKey('Business', to_field='id')
2.python manage.py makemigrations
3.python manage.py migrate
(5)编写url.py
知识点$终止符防止截胡
from django.conf.urls import url
from django.contrib import admin
from cm import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#url 对应函数跳转
url(r'^business$',views.business),
]
(6)编写views
def business(request):
if request.method == 'GET':
# Queryset[obj(id,caption,code),obj,obj]
obj = models.Business.objects.all()
# Queryset[{caption:'测试'},{},{}]
#select caption from business
v = models.Business.objects.values('caption')
## Queryset[(1,运维部),(),()]
vv = models.Business.objects.values_list('caption')
return render(request,'business.html',{'obj':obj,'obj1':v,'obj2':vv})
(7)编写templates
Title
业务线
{% for i in obj %}
- {{ i.id }}-{{ i.caption }}
{% endfor %}
业务线字典
{% for i in obj1 %}
- {{ i.caption }}
{% endfor %}
业务线元组
{% for i in obj2 %}
- {{ i.0 }}
{% endfor %}
(8)页面效果展示
(9)页面计数forloop
forloop.counter 从1开始
forloop.counter0 从0开始
forloop.recounter0 倒叙从0
forloop.recounter 倒叙
forloop.last 是否是最后
forloop.first 是否是第一个
forloop.parentloop 嵌套循环使用
页面展示
model.py
def host(request):
if request.method == 'GET':
# Queryset[obj(id,caption,code),obj,obj]
obj = models.Host.objects.all()
b_name = models.Business.objects.all()
return render(request,'host.html',{'obj':obj,'b': b_name})
elif request.method =='POST':
h = request.POST.get('hostname')
i = request.POST.get('ip')
p = request.POST.get('port')
b_id = request.POST.get('b_name')
models.Host.objects.create(
hostname=h,
ip= i,
port=p,
b_id=b_id
)
return redirect('/host')
html
Title
业务线
{% for i in obj %}
- {{ forloop.counter }}{{ i.hostname }}-{{ i.ip }}-{{i.port }}-{{ i.b.caption }}
{% endfor %}