天天看点

Django模型关系

Django模型关系

模型关系

1:1 一对一 (一个身份证对应一个驾照)

  • 是使用外键+唯一约束实现的
  • 对应最多只能有一个
  • 我们通常会在从表中声明关系
  • 主表,从表
  • 主表数据删除,从表数据级联删除
  • 从表数据删除,主表不受影响
  • 谁声明关系,谁就是从表
driver_idcard = models.OneToOneField(IDCard,on_delete=models.PROTECT)      
  • 主表获取从表数据,是通过隐性属性,隐性属性的名字 默认是从表名字小写
print(idcard.drivercard.driver_lever)      
  • 从表获取主表数据,是通过显性属性
print(dc.driver_idcard.id_name)      

1:M(一个人对应多辆车)

  • 使用外键实现的
  • 主表获取从表是隐性属性,隐性属性是Manager的子类
  • 支持
  • all
  • filter
  • first
  • last
  • 数据删除和一对一一样
- 从表获取主表数据,是通过显性属性
  idcard = car.c_idcard
  print(idcard.id_name
  - 主表获取从表数据,是通过隐性属性,隐性属性的名字 默认是从表名字小写
    idcard = IDCard.objects.last()
    cars = idcard.car_set.last()      
实例

models.py

from django.db import models

# Create your models here.
class IDCard(models.Model):
    id_num = models.CharField(max_length=32,unique=True)
    id_name = models.CharField(max_length=32)

class DriverCard(models.Model):
    diver_leverl = models.CharField(max_length=16)
    driver_idcard = models.OneToOneField(IDCard,on_delete=models.PROTECT)

class Car(models.Model):
    c_type = models.CharField(max_length=32)
    c_idcard = models.ForeignKey(IDCard,null=True)      

view.py

import random
import uuid

from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from RelationLearn.models import IDCard, DriverCard, Car


def index(request):
    return HttpResponse("three index")





def add_idcard(request):
    id_card = IDCard()
    id_card.id_num = random.randrange(10000000000)
    id_card.id_name = uuid.uuid4().hex
    id_card.save()

    return HttpResponse("add new id card ok")

def add_dc(request):
    dc = DriverCard()
    dc.diver_level = "c1"
    id_card = IDCard.objects.last()
    dc.driver_idcard =id_card
    dc.save()
    return HttpResponse("add killer  ok")

def delete_idcard(request):
    id_card = IDCard.objects.last()
    id_card.delete()
    return HttpResponse("del idcard  ok")


def del_dc(request):
    dc_card = DriverCard.objects.last()
    dc_card.delete()
    return HttpResponse("del dc  ok")

def get_idcard(request):
    dc= DriverCard.objects.last()
    print(dc.driver_idcard.id_name)
    return HttpResponse("by carid get id")

def get_dc(request):
    idcard= IDCard.objects.last()
    print(idcard.drivercard.driver_lever)
    return HttpResponse("by id get carid")


def get_idcard_form_car(request):
    car =Car.objects.last()
    idcard = car.c_idcard
    print(idcard.id_name)
    return HttpResponse("by car gei id ")

def get_car(request):
    idcard = IDCard.objects.last()
    cars = idcard.car_set.last()
    for car in cars:
        print(car)

    car_single = idcard.car_set.first()
    print(car_single.c_type)

    return HttpResponse("get cars by id")

def add_car(request):
    # car = Car()
    # car.c_type = "tiganche"
    # idcard = IDCard.objects.last()
    # car.c_idcard = idcard
    # car.save()

    car = Car()
    car.c_type = "olddriver"
    car.save()
    idcard = IDCard.objects.last()
    idcard.car_set.add(car)

    return HttpResponse("add car ")      
  • M:N
  • 使用额外的关系表进行数据记录
  • 关系表使用两个外键实现的
from django.db import models

# Create your models here.
class BlogUser(models.Model):
    u_name =models.CharField(max_length=32)

class Blog(models.Model):
    b_title =models.CharField(max_length=64)
    b_content =models.TextField()
    b_user_collect =models.ManyToManyField(BlogUser)      
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
from ManyLearn.models import *


def index(request):
    return HttpResponse("index many")

def add_collect(request):
    # blog = Blog.objects.last()
    # # blog= Blog()
    # user =BlogUser.objects.first()
    # blog.b_user_collect.add(user)
    # return HttpResponse("add collect")
    blog = Blog.objects.last()
    user = BlogUser.objects.last()
    user.blog_set.add(blog)
    return HttpResponse("add collect")


def del_collects(request):
    blog = Blog.objects.all()
    user = BlogUser.objects.get(id = "3")
    user.blog_set.remove(*blog)
    return HttpResponse("del collects ok")
# 查询指定用户的收藏的所有博客
def get_usercollects(request):

    user = BlogUser.objects.first()

    # print(user.blog_set.all().values())
    collections = user.blog_set.all()
    return render(request,"AllCollects.html",context=locals())
# 查询指定博客被哪些用户收藏了
def get_user(request):

    blog = Blog.objects.first()
    # blog=Blog()
    users = blog.b_user_collect.all()

    return render(request,"AllCollectsUser.html",context=locals())      

模型级联操作

  • CASECADE
  • 默认模式
  • 默认级联删除
  • PROTECT
  • 保护模式
  • 存在级联数据就不能删除
  • 不存在级联数据就可以删除
  • SET
  • 设置为某值
  • NULL
  • 字段允许为空
  • DEFAULT
  • 字段存在默认值
  • VALUE
  • VALUE是真实的值