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)          # 查看相连的内容
]
urls.py

 

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>
login.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>
index.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>
relation.html,查看相亲过的表
<h2>当前用户:{{ request.session.user_info.nickname }}</h2>
<a href="/logout/">注销</a>
user_header.html,使用小组件

 

二、多对多关系

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) #在表内通过对象外键取值

 

posted on 2019-02-26 20:42  smile大豆芽  阅读(179)  评论(0)    收藏  举报