Day51 of learning python --连表实例、M2M和FK自关联
一、要求:相亲网
1.登陆,基于session,装饰器 2.数据库表, 男生表: ID name password 女生表: ID name passowrd 男生女生关系表: nid nid 3.功能: 登陆页: 用户名: 密码: 性别: 一个月免登陆,checkebox: 查看异性列表:session[id] 查看与自己有染的异性姓名列表:
from django.contrib import admin from django.urls import path,re_path from app01.views import account,love urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^login.html$',account.login), # 登陆页面,account存放登陆相关的东西 path('index/',love.index), # 展示 path('logout/',account.logout), # 删除cookies path('relation/',love.relation) # 查看相连的内容 ]
models.py:创建表
from django.db import models # Create your models here. class Boy(models.Model): nickname = models.CharField(max_length=32) username = models.CharField(max_length=32) password = models.CharField(max_length=64) class Girl(models.Model): nickname = models.CharField(max_length=32) username = models.CharField(max_length=32) password = models.CharField(max_length=64) class B2G(models.Model): b = models.ForeignKey(to='Boy',to_field='id',on_delete=models.CASCADE) g = models.ForeignKey('Girl',on_delete=models.CASCADE)
account.py:登陆页
from django.shortcuts import render,HttpResponse,redirect from app01 import models def login(request): if request.method == 'GET': return render(request,'login.html') else: usr = request.POST.get('username') pwd = request.POST.get('password') gender = request.POST.get('gender') rmb = request.POST.get('rmb') # 性别判断 if gender == '1': obj = models.Boy.objects.filter(username=usr,password=pwd).first() else: obj = models.Girl.objects.filter(username=usr,password=pwd).first() if not obj: return render(request,'login.html',{'msg':'用户或者密码错误'}) else: request.session['user_info'] = {'username':usr,'gender':gender,'user_id':obj.id,'nickname':obj.nickname} return redirect('/index/') def logout(request): if request.session.get('user_info'): request.session.delete(request.session.session_key) return redirect('/login.html')
love.py:关系页
from django.shortcuts import render,redirect from app01 import models from functools import wraps def deco(func): @wraps(func) def inner(request,*args,**kwargs): if request.session.get('user_info'): return func(request,*args,**kwargs) else: return redirect('/login.html') return inner @deco def index(request): # 男:女生列表 # 女:男生列表 gender = request.session.get('user_info').get('gender') if gender == '1': user_list = models.Girl.objects.all() else: user_list = models.Boy.objects.all() return render(request,'index.html',{'user_list':user_list}) def relation(request): if not request.session.get('user_info'): return redirect('/login.html') else: user_id = request.session.get('user_info').get('user_id') gender = request.session.get('user_info').get('gender') if gender == '1': # 这个一定是个字符串,否则筛选会出问题 lst = models.B2G.objects.filter(b_id=user_id).values('g__nickname') else: lst = models.B2G.objects.filter(g_id=user_id).values('b__nickname') # 得到的是一个字典 return render(request,'relation.html',{'lst':lst})
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>登陆</h3> <form action="/login.html" method="post"> {% csrf_token %} <p>姓名:<input type="text" name="username"></p> <p>密码:<input type="text" name="password"></p> <p>性别: 男<input type="radio" name="gender" value="1"> 女<input type="radio" name="gender" value="2"> </p> <p> <input type="checkbox" name="rmb" value="11">免登陆一个月 </p> <p><input type="submit" value="提交"></p>{{ msg }} </form> </body> </html>
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% include 'user_header.html' %} <p><a href="/relation/">查看相亲过女孩子的名单</a></p> <h3>异性列表</h3> <ul> {% for row in user_list %} <li>{{ row.nickname }}</li> {% endfor %} </ul> </body> </html>
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% include 'user_header.html' %} <h3>与异性相关的列表</h3> <ul> {% for row in lst %} {% if row.g__nickname %} <li>{{ row.g__nickname }}</li> {% else %} <li>{{ row.b__nickname }}</li> {% endif %} {% endfor %} </ul> </body> </html>
<h2>当前用户:{{ request.session.user_info.nickname }}</h2> <a href="/logout/">注销</a>
二、多对多关系
1)由三张表变成两张表,创建表
from django.db import models # Create your models here class UserInfo(models.Model): # 把男女放在同一张表内 nickname = models.CharField(max_length=16) name = models.CharField(max_length=16) password = models.CharField(max_length=32) gender_choice = ( (1,'男'), (2,'女'), ) gender = models.IntegerField(choices=gender_choice) class U2U(models.Model): g = models.ForeignKey('UserInfo',related_name='boys',on_delete=models.CASCADE) b = models.ForeignKey('UserInfo',related_name='girls',on_delete=models.CASCADE)
import os if __name__=='__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Day75one.settings') import django django.setup() from app01 import models # models.U2U.objects.create(b_id=1,g_id=4) # models.U2U.objects.create(b_id=1, g_id=5) # models.U2U.objects.create(b_id=1, g_id=6) # models.U2U.objects.create(b_id=2, g_id=5) # models.U2U.objects.create(b_id=3, g_id=6) # b = models.UserInfo.objects.filter(gender=1,id=2).first() # g = models.UserInfo.objects.filter(gender=2,id=4).first() # models.U2U.objects.create(b=b,g=g) obj = models.UserInfo.objects.filter(id=1).first() # 先获取男生对象 lst = obj.girls.all() # 获取相关这个男生的U2U关系QuerySet,<QuerySet [<U2U: U2U object (1)>, <U2U: U2U object (2)>, <U2U: U2U object (3)>]> print(lst) for u in lst: print(u.g.nickname) #在表内通过对象外键取值
浙公网安备 33010602011771号