• Django之Models(二)


    Django之Models(二)

    创建一对多的关系

    一个出版商可以有多本出版的书
    一本书只有一个出版商
    

    创建一对多的语法:

    字段名= models.ForeignKey(关联表(类名),on_delete=[选项]) 
    注意:这里外键字段名不要在加上id,默认会加上。
    我在这里加上了ID,会变成publisherID_id。
     1 from django.db import models
     2 
     3 # Create your models here.
     4 
     5 
     6 
     7 class Publisher(models.Model):
     8     name = models.CharField(max_length=30)
     9     city = models.CharField('城市',max_length=60)
    10 
    11 class Book(models.Model):
    12     name=models.CharField(max_length=20)
    13     price=models.IntegerField()
    14     pub_date=models.DateField()
    15     author=models.CharField(max_length=32,null=False)
    16     publisherID= models.ForeignKey(Publisher,on_delete=models.SET)

     

     

    报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'

    注意:一定要加上on_delete参数

    
    on_delete参数的各个值的含义:
    
    on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
    on_delete=models.CASCADE,     
    # 删除关联数据,与之关联也删除
    on_delete=models.DO_NOTHING,  
    # 删除关联数据,什么也不做
    on_delete=models.PROTECT,    
    # 删除关联数据,引发错误ProtectedError
    # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
    on_delete=models.SET_NULL,   
    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
    # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
    on_delete=models.SET_DEFAULT,
    # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
    on_delete=models.SET,         
    # 删除关联数据,
     a. 与之关联的值设置为指定值,设置:models.SET(值)
     b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    

      

     

     增加数据

    方式一:
    #publisherID_id=2:通过赋值的办法
    Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID_id=2)
    
    
    方式二:
    #publisherID=publish_obj:通过赋值对象的办法
    publish_obj=Publish.objects.filter(name="人民出版社")[0]  #这里filter返回是一个集合对象,使用需要[]取出来用
    Book.objects.create(name="linux运维",price=77,pub_date="2019-02-10",author="",publisherID=publish_obj)
    

      

      

     查询数据

    正向查询

    # book_obj=Book.objects.get(name="python")
        # print(book_obj.name)
          print(book_obj.price)
          print(book_obj.pub_date)
          print(book_obj.author)
        #  如何拿到与它绑定的Publisher对象呢?
        #  一对多:这里外键publisherID一定是一个对象
        # print(book_obj.publisherID.name)
        # print(book_obj.publisherID.city)
    

      

    反向查询

       pub_obj=Publisher.objects.filter(name="人民出版社")[0]
        print(pub_obj.name)
        print(pub_obj.city)
        #pub_obj.book_set是一个queryset集合
        #如何拿到与它绑定的Book对象呢?
        print(pub_obj.book_set.all().values('name','price'))
    

      

    (filter valuse 双下划线)

    #正向查询:通过外键__字段
    python的出版商
    ret1 =Book.objects.filter(name="python").values("publisherID__name"))
    

      

    #反向查询:通过表名__字段
    
    python的出版商
    ret1 = Publisher.objects.filter(book__name='python').values('name')
    

      

  • 相关阅读:
    Spring学习4_整合Hibernate进行数据库操作
    spring学习3_通过注解简单实现AOP
    Spring学习2_AOP通过XML配置简单实现
    Spring学习1_面向切面( AOP )实现原理
    hibernate学习6_session之clear与flush
    hibernate学习5_session之load与get区别
    hibernate学习4_openSession()与getCurrentSession()区别
    utf8汉字编码16进制对照
    Debug
    服务器设计过程中踩过的坑儿
  • 原文地址:https://www.cnblogs.com/-wenli/p/10423578.html
Copyright © 2020-2023  润新知