by:aideny
time:2019/10/4
注:博主也是前天才接触django和postgresql,读者如果有什么问题可以一起交流沟通~
开发环境首先要安装配置好postgresql,并且要创建好一个可用的数据库,这个数据库就是后面django主要用到的。
博主配置:
Postgresql: 9.4
数据库:test
用户名:test
密码:test
django-admin startproject TestDjango
打开TestDjango/TestDjango/setting.py
:
DATABASES = {
# django默认的数据库是sqlite,我们需要注释掉或者删掉关于sqlite的配置
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# postgressql相关的配置
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'test', # 在postgresql中创建的数据库名
'USER': 'test', # postgresql 用户名
'PASSWORD': 'test', # postgresql 用户密码
'HOST': '192.168.204.129', # 主机IP
'PORT': 5432, # postgresql 端口号
}
}
USE_IZ = False # 不使用默认的时区
TIME_ZONE = 'Asia/Shanghai' # 使用上海时区
TEMPLATES = [
{
# somthing configuration
'DIRS': [BASE_DIR + "/templates"], # 配置模板路径,注意结尾有一个半角逗号
# somthing configuration
}
]
在manage.py
的同级目录下创建目录:templates
ALLOWED_HOSTS = ['*'] # 表示允许所有主机访问
python manage.py startapp fakedata
这里是这样设计的,models包含两个类:User和Comment。
User类包含的属性有:用户名,密码,Email,注册时间。
Comment包含的属性有:评论内容,评论发布时间。
这两个类之间还有一种“多对多”的关系,在django中表示这种关系的机制是:它会自动创建一张表来存储这两个类之间的关系,如果这张表中只有这两个字段(两个类),那么直接用ManyToManyField
属性默认的即可;如果这张表中除了这两个字段外,还有其他的字段,比如这里的用户和评论关系表中,除了用户和评论内容外,还有一个评论的发布时间,那么就要用throught
导出到另外的一个类来说明。详细的操作步骤可以参考下面的代码。
打开fakedata/models.py
# -*- coding:UTF-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.utils import timezone
class User(models.Model):
name = models.CharField(max_length=20) # 用户名
password = models.CharField(max_length=20) # 用户密码
email = models.EmailField() # Email
register_date = models.DateField() # 注册时间
class Comment(models.Model):
data = models.CharField(max_length=100) # 评论内容
users = models.ManyToManyField(User, through="UserComment") # 建立多对多关系
# 用throught导出到一个单独的类来说明用户和评论之间的关系
class UserComment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE) # user作为外键
comment = models.ForeignKey(Comment, on_delete=models.CASCADE) # comment作为外键
pushed_at = models.DateTimeField(default=timezone.now)
# 用户和评论的关系表使用自定义的名称
class Meta:
db_table = "user_comment_relationsship"
打开TestDjango/TestDjango/setting.py
:
INSTALLED_APPS = [
# default confiuratuin
'fakedate', # 添加刚才的模型,注意结尾有一个半角逗号
]
python manage.py makemigrations
python manage.py migrate
到这里django项目中要用到的数据库表结构就已经创建好了。
编写模型代码和设计模板结构其实是同步进行的,在编写模型代码的过程中考虑会用到的模板
打开TestDjango/TestDjango/testdb.py
(这个文件需要我们创建,文件名无所谓,合理即可):
# -*- coding:UTF-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
from datetime import date
from datetime import datetime
from fakedata.models import User # 引入User表句柄
from fakedata.models import Comment # 引入Comment表句柄
from fakedata.models import UserComment # 引入UserComment表句柄
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def register_form(request):
return render_to_response('register_form.html')
def register(request):
'''
注册用户
'''
request.encoding = 'utf-8'
user_name = request.GET['UserName']
passwd = request.GET['PassWord']
Email = request.GET['Email']
User.objects.create(name=user_name, password=passwd, email=Email, register_date=date.today())
response = "注册成功!
"
return HttpResponse(response)
def get_user(request):
'''
获取已注册的所有用户信息
'''
List = User.objects.all()
response = ""
for var in List:
response += var.name + " | " + var.password + " | " + var.email + "
"
return HttpResponse(""
+ response + "")
def push_comment_form(request):
return render_to_response('comment_form.html')
def push_comment(request):
'''
发表评论
'''
request.encoding = 'utf-8'
user_name = request.GET['UserName']
message = request.GET['Message']
# 获取作者中间模型
user_tmp = User.objects.get(name=user_name)
# 添加评论,并获取评论中间模型
comment_tmp = Comment.objects.create(data=message)
# 向 user_comment_relationship 表添加数据
UserComment.objects.create(user=user_tmp, comment=comment_tmp, pushed_at=datetime.now())
response = "注册成功!
"
return HttpResponse(response)
def get_comment(request):
'''
获取评论信息
'''
List = UserComment.objects.all()
response = ""
for var in List:
response += var.user.name + " | " + str(var.pushed_at)[0:-7] + " | " +\
var.comment.data + "
"
return HttpResponse(""
+ response + "")
打开TestDjango/TestDjango/urls.py
from django.conf.urls import url
from django.contrib import admin
from . import testdb
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^register_form/$', testdb.register_form), # 注册界面url
url(r'^register/$', testdb.register), # 注册cgi url
url(r'^get_user/$', testdb.get_user), # 获取所有用户信息url
url(r'^comment_form/$', testdb.push_comment_form), # 添加评论界面
url(r'^comment/$', testdb.push_comment), # 评论cgi url
url(r'^get_comment/$', testdb.get_comment), # 获取所有评论信息界面url
]
前端页面写的很简陋,这里的代码只是为了简单的支持我们项目的运行~
编写register_form.html
:
<DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Registertitle>
head>
<body>
<form action="/register/" method="get">
UserName: <br>
PassWord: <br>
Email : <br>
<input type="submit" value"提交">
form>
body>
html>
编写comment_form.html
:
<html>
<head>
<meta charset="utf-8" />
<title>评论title>
head>
<body>
<form action="/comment/">
用户名:<input type="text" name="UserName"><br><br>
<textarea rows="10" cols="30" placeholder="内容" name="Message">textarea>
<input type="submit" value="发表">
form>
body>
html>
现在这个项目就可以完整跑一边流程了。
启动项目:python manage.py runserver 192.168.204.128:8000
访问http://192.168.204.128/register_form/
:
注册:
访问http://192.168.204.128/get_user/
:
访问http://192.168.204.128/comment_form/
:
访问http://192.168.204.128/get_comment/
:
启动命令:psql -h localhost -p 5432 -U test --password
列举数据库:\l
选择数据库:\c 数据库名
查看该某个库中的所有表:\dt
查看某个库中的某个表结构:\d 表名
退出psgl:\q
https://docs.djangoproject.com/en/1.11/ref/models/fields/#model-field-types
https://m.w3cschool.cn/django