数据库 模型
创建数据库模型
- 在polls/models.py中设计模型
- 安装应用到项目,在project/settings.py INSTALLED_APPS中添加polls.apps.PollsConfig
- python manage.py makemigrations 生成迁移文件,不改变数据库
- python manage.py migrate 更新数据库
进入交互模式
python manage.py shell
设计模型
如果你想自己指定主键, 在你想要设置为主键的字段上设置参数 primary_key=True。如果 Django 看到你显式地设置了 Field.primary_key,将不会自动在表(模型)中添加 id
列。
from django.db import models
class DetectRecord(models.Model):
uuid = models.UUIDField()
time = models.DateTimeField()
date = models.DateField()
money = models.DecimalField()
float = models.FloatField()
name = models.CharField(max_length=64)
pic = models.BinaryField()
pic_type = models.CharField(max_length=32)
pic_sha256 = models.CharField(max_length=64)
req_id = models.AutoField(primary_key=True) # 一个 IntegerField,根据可用的 ID 自动递增
res = models.IntegerField()
acc = models.IntegerField()
ORM
from detect.models import DetectRecord as DR
from django.shortcuts import get_object_or_404
DR.objects.raw("select * from table") # sql
DR.objects.all() # lazy, 查
DR.objects.filter(f1=f1, f2=f2) # lazy, 查
DR.objects.filter(f1=f1, f2=f2).update(f1=g1, f2=g2) # 改
DR.objects.filter(f1=f1, f2=f2).delete() # 删
# 查, 返回单对象, 不存在会抛出DR.DoesNotExist, 存在多个会抛出DR.MultipleObjectsReturned
DR.objects.filter(f1=f1, f2=f2).get()
# 会抛出Http404或DR.MultipleObjectsReturned
get_object_or_404(DR, f1=f1, f2=f2)
DR.objects.all()[:10] # 查
DR.objects.all().order_by("-rating") # 查
ndr = DR(...) # 增
ndr.save()
HTTP
from django.http import HttpResponse, JsonResponse
return HttpResponse(content=b'', content_type=None, status=200, reason=None, charset=None, headers=None)
return JsonResponse(data) # JsonResponse是HttpResponse的子类
request是HttpRequest的实例
request.GET是QueryDict的实例
request.FILES是类似字典的对象
def view(request):
if request.method == "GET":
p1 = request.GET.get("p1") # 只返回1个
p1list = request.GET.getlist("p1")
elif request.method == "POST":
files = request.FILES.getlist("pic")
URL
from django.urls import path, include
from . import views
urlpatterns = [
path("", include("visual.urls")),
path("detect/", views.detect, name="detect"),
path("home/log/getimg/<uuid:uuid>/", views.get_img, name="get_img"), # <type:name>
]
def get_img(request, uuid):
pass
WebSocket
一个连接初始化一个Consumer
from channels.generic.websocket import AsyncWebsocketConsumer
class MyConsumer(AsyncWebsocketConsumer):
def __init__(self):
super().__init__()
pass
async def connect(self):
await self.channel_layer.group_add("broadcast", self.channel_name) # 加入组
await self.accept() # 完成连接
# 清理工作
async def disconnect(self, close_code):
await self.channel_layer.group_discard("broadcast", self.channel_name) # 退出组
async def receive(self, text_data):
await self.send("hello world")
await self.close()
ASGI
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "contest.settings")
django.setup()
from visual import consumers
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter([
path('ws/visual/', consumers.VConsumer.as_asgi()),
])
)
})
uvicorn contest.asgi:application --reload
中间件
channels
Channels is a project that takes Django and extends its abilities beyond HTTP - to handle WebSockets, chat protocols, IoT protocols, and more. It’s built on a Python specification called ASGI.