zoukankan      html  css  js  c++  java
  • Django系列12:Django模型关系

    迁移

    • 分两步实现
      • 生成迁移文件
      • 执行迁移文件
    • 迁移文件的生成
      • 根据models文件生成对应的迁移文件
      • 根据models和已有迁移文件差别 生成新的迁移文件
    • 执行迁移文件
      • 先去迁移记录查找,哪些文件未迁移过
        • app_label + 迁移文件名字
      • 执行未迁移的文件
      • 执行完毕,记录执行过的迁移文件
    • 重新迁移
      • 删除迁移文件
      • 删除迁移文件产生的表
      • 删除迁移记录

    一对一 1:1

    • 应用场景
      • 用于复杂表的拆分
      • 扩展新功能
    • Django中 OneToOneField
      • 使用的时候,关系声明还是有细微差别的
    • 实现
      • 使用外键实现的
      • 对外键添加了唯一约束
    • 数据删除
      • 级联表
        • 主表
        • 从表
        • 谁声明关系谁就是从表
        • 在开发中如何确认主从
          • 当系统遭遇不可避免毁灭时,只能保留一张表,这个表就是你的主表
      • 默认特性(CASECADE)
        • 从表数据删除,主表不受影响
        • 主表数据删除,从表数据直接删除
      • PROTECT 受保护
        • 开发中为了防止误操作,我们通常会设置为此模式
        • 主表如果存在级联数据,删除动作受保护,不能成功
        • 主表不存在级联数据,可以删除成功
      • SET
        • SET_NULL
          • 允许为NULL
        • SET_DEFAULT
          • 存在默认值
        • SET()
          • 指定值
      • 级联数据获取
        • 主获取从 隐性属性 默认就是级联模型的名字
        • 从获取主,显性属性,就是属性的名字

    一对多 1:N

    • ForeignKey
    • 主从获取
      • 主获取从 隐性属性 级联模型_set
        • student_set Manager的子类
          • all
          • filter
          • exclude
          • Manager上能使用的函数都能使用
      • 从获取主
        • 显性属性

    多对多M:N

      • 实际上最复杂
      • 开发中很少直接使用多对多属性,而是自己维护多对多的关系
      • 产生表的时候会产生单独的关系表
        • 关系表中存储关联表的主键,通过多个外键实现的
        • 多个外键值不能同时相等
      • 级联数据获取
        • 从获取主
          • 使用属性,属性是一个Manager子类
        • 主获取从
          • 隐性属性
            • 也是Manager子类,操作和从操作主完全一样
      • 级联数据
        • add
        • remove
        • clear
        • set
    • ManyRelatedManager
      • 函数中定义的类
      • 并且父类是一个参数
      • 动态创建

    代码

    modle.py
    from django.db import models
    
    
    class Person(models.Model):
        p_name = models.CharField(max_length=16)
        p_sex = models.BooleanField(default=False)
    
    
    class IDCard(models.Model):
        id_num = models.CharField(max_length=18, unique=True)
        id_person = models.OneToOneField(Person, null=True, blank=True, on_delete=models.SET_NULL)
    
    
    class Customer(models.Model):
    
        c_name = models.CharField(max_length=16)
    
    
    class Goods(models.Model):
    
        g_name = models.CharField(max_length=16)
        g_customer = models.ManyToManyField(Customer)
    
    
    class Animal(models.Model):
        a_name = models.CharField(max_length=16)
    
        class Meta:
            abstract = True
    
    
    class Cat(Animal):
        c_eat = models.CharField(max_length=32)
    
    
    class Dog(Animal):
        d_legs = models.IntegerField(default=4)
    
    urls.py
    urlpatterns = [
        url(r'^hello/', views.hello, name='hello'),
        url(r'^addperson/', views.add_person, name='add_person'),
        url(r'^addidcard/', views.add_idcard, name='add_id_card'),
        url(r'^bindcard/', views.bind_card, name='bind_card'),
        url(r'^removeperson/', views.remove_person, name='remove_person'),
        url(r'^removeidcard/', views.remove_idcard, name='remove_idcard'),
        url(r'^getperson/', views.get_person, name='get_person'),
        url(r'^getidcard/', views.get_idcard, name='get_idcard'),
    
        url(r'^addcustomer/', views.add_customer, name='add_customer'),
        url(r'^addgoods/', views.add_goods, name='add_goods'),
        url(r'^addtocart/', views.add_to_cart, name='add_to_cart'),
        url(r'^getgoodslist/(?P<customerid>d+)/', views.get_goods_list, name='get_goods_list'),
    
        url(r'^addcat/', views.add_cat, name='add_cat'),
        url(r'^adddog/', views.add_dog, name='add_dog'),
    ]
    
    views.py
    from django.http import HttpResponse
    from django.shortcuts import render
    
    # Create your views here.
    from Two.models import Person, IDCard, Customer, Goods, Cat, Dog
    
    
    def hello(request):
        return HttpResponse("Two Hello")
    
    
    def add_person(request):
    
        username = request.GET.get("username")
    
        person = Person()
    
        person.p_name = username
    
        person.save()
    
        return HttpResponse("Person创建成功 %d" % person.id)
    
    
    def add_idcard(request):
    
        id_num = request.GET.get("idnum")
    
        idcard = IDCard()
    
        idcard.id_num = id_num
    
        idcard.save()
    
        return HttpResponse("IDCard %d" % idcard.id)
    
    
    def bind_card(request):
    
        person = Person.objects.last()
    
        idcard = IDCard.objects.last()
    
        idcard.id_person = person
    
        idcard.save()
    
        return HttpResponse("绑定成功")
    
    
    def remove_person(request):
    
        person = Person.objects.last()
    
        person.delete()
    
        return HttpResponse("人员移除成功")
    
    
    def remove_idcard(request):
    
        idcard = IDCard.objects.last()
    
        idcard.delete()
    
        return HttpResponse("身份证移除成功")
    
    
    def get_person(request):
    
        idcard = IDCard.objects.last()
    
        person = idcard.id_person
    
        return HttpResponse(person.p_name)
    
    
    def get_idcard(request):
    
        person = Person.objects.last()
    
        idcard = person.idcard
    
        return HttpResponse(idcard.id_num)
    
    
    def add_customer(request):
    
        c_name = request.GET.get("cname")
    
        customer = Customer()
    
        customer.c_name = c_name
    
        customer.save()
    
        return HttpResponse("创建消费者成功%d" % customer.id)
    
    
    def add_goods(request):
    
        g_name = request.GET.get("gname")
    
        goods = Goods()
    
        goods.g_name = g_name
    
        goods.save()
    
        return HttpResponse("创建商品成功%d" % goods.id)
    
    
    def add_to_cart(request):
        customer = Customer.objects.last()
        goods = Goods.objects.last()
        '''
         print(type(goods.g_customer))
      
        print(goods.g_customer)
        goods.g_customer.add(customer)
        '''
        customer.goods_set.add(goods)
        return HttpResponse("添加成功")
    
    
    def get_goods_list(request, customerid):
        customer = Customer.objects.get(pk=customerid)
        goods_list = customer.goods_set.all()
        return render(request, 'goods_list.html', context=locals())
    
    
    def add_cat(request):
        cat = Cat()
        cat.a_name = "Tom"
        cat.c_eat = "Fish"
        cat.save()
        return HttpResponse("Cat 创建成功 %d" % cat.id)
    
    def add_dog(request):
        dog = Dog()
    
        dog.a_name = "Tom"
    
        dog.save()
    
        return HttpResponse("Dog 创建成功 %d" % dog.id)
    
    templatesgood_list.html
    <ul>
        {% for goods in goods_list %}
            <li>{{ goods.g_name }}{{ goods.id }}</li>
        {% endfor %}
    </ul>
    

    继承

  • 相关阅读:
    C#构造函数、操作符重载以及自定义类型转换
    类型和成员基础
    基元类型、引用类型和值类型
    类型基础
    Sublime之快捷键(二)
    Sublime之插件的安装(三)
    Sublime删除项目删不掉?
    Sublime之插件的安装(二)
    手机网页的头部meta的相关配置~~
    Rem自适应js---flexible.min.js
  • 原文地址:https://www.cnblogs.com/xidianzxm/p/12286466.html
Copyright © 2011-2022 走看看