Django.2
首先使用pycharm创建django工程
在工程文件内的settings.py文件中修改配置
- DATABASES中为连接的数据库(mysql数据库方式)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'HelloDjango',(数据库的名称,应提前创建好) 'USER': 'root', 'HOST': '127.0.0.1', 'PASSWORD': 'your password', 'PORT': '3306', } }
-
- 需要在__init__.py文件中添加引擎
import pymysql pymysql.install_as_MySQLdb()
- 若想所有人访问
ALLOWED_HOSTS = [ "*" ]
- 时区和语言
# 调整时区和语言 LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai'
创建项目文件(例App)
- 打开终端
- python manage.py startapp App
- App项目创建好后,需要在工程文件的settings.py中注册才可以使用
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'App' ]
- 还要在工程文件的urls.py中添加路由
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app/', include('App.urls')), ]
需要在App中自行创建urls.py文件,手动添加相应想要的路由
urlpatterns = [ url(r'^addgrade/', views.add_grade), url(r'^getgrades/', views.get_grades), url(r'^addstudent/', views.add_student), url(r'^getgrade/', views.get_grade), url(r'^getstudent/', views.get_student), ]
(这样相应的路由就对应了相应的视图函数,比如:/app/addgrade/所对应的视图函数名称就是add_grade)
创建模型
class Grade(models.Model): g_name = models.CharField(max_length=32) class Student(models.Model): s_name = models.CharField(max_length=32) s_age = models.IntegerField(default=18) s_grade = models.ForeignKey(Grade)
- 执行迁移文件
- python manage.py makemigrations
- python manage.py migrate
- (迁移后会在连接的数据库中生成模型映射表)
操作视图函数
def add_grade(request): grade = Grade() #实例化模型 grade.g_name = "Python%d" % random.randrange(1000) #生成对象 grade.save() # 将对象保存到数据库中 return HttpResponse("添加成功%s" % grade.g_name)
- 获取模型中的所有集合
grades = Grade.objects.all()
渲染模版:
# request:请求, 'Grade.html':渲染的模版名称, context:传递的参数 return render(request, 'Grade.html', context={"grade": grade})
逻辑删除
# 自定义模型管理器 class TeachManager(Manager): def get_queryset(self): queryset = super().get_queryset().filter(is_delete=False) # 将filter条件查询时,自动加上条件,即查询is_delete为false的对象 return queryset class Goods(models.Model): g_name = models.CharField(max_length=32) g_price = models.FloatField(default=1) is_delete = models.BooleanField(default=False) # 设置is_delete字段,默认值为False,即为0,不删除 def delete(self, using=None, keep_parents=False): self.is_delete = True self.save() # 当调用删除时,将is_delete值更改为True,即为1,删除(逻辑删除,数据库里并没有删除) objects = TeachManager()
一对一(OneToOneField)
class User(models.Model): u_name = models.CharField(max_length=32) class Vip(models.Model): v_level = models.IntegerField(default=0) v_user = models.OneToOneField(User, on_delete=models.PROTECT) # 不允许级联删除,即不允许删除用户从而删除vip表中对应的数据 # models.CASCADE 默认值 # models.PROTECT 保护模式 # models.SET_NULL 置空模式 # models.SET_DEFAULT 置默认值 # models.SET() 删除的时候重新动态指向一个实体
一对多(ForeignKeyField)
- 想要获取一所对应的多的集合,直接用 从表_set 即可
多对多(ManyToManyField)
class User(models.Model): u_name = models.CharField(max_length=32) class Goods(models.Model): g_name = models.CharField(max_length=32) g_users = models.ManyToManyField(User) # 自动以两表的逐主键为字段创建一张表 # 依旧有主从表关系(主表为User,从表为Goods) # goods_list = user.goods_set.all() # users_list = goods.g_users.all()