zoukankan      html  css  js  c++  java
  • 四、Django学习之关系表介绍及使用

    关系表介绍及使用

    一对一关系

    xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE)  
    #on_delete:删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除的,2.x版本的django要写.
    

    增加数据

    方式1

    new_author_detail = models.AuthorDetail.objects.create(
            birthday='1979',
            telephone='138',
            addr='black'
        )
        # 方式1
        models.Author.objects.create(
            name='王涛',
            age=18,
            #直接将对象赋值属性
            authorDetail=new_author_detail 
        )
    

    方式2

    new_author_detail = models.AuthorDetail.objects.create(
            birthday='1979',
            telephone='138',
            addr='black'
        )
        # 方式2
        models.Author.objects.create(
            name='王涛',
            age=18,
            authorDetail_id=new_author_detail.id
        )
    

    删除数据

    表一外键关联到表二,表一删除,不影响表2,表2删除会影响表1

    models.AuthorDetail.objects.get(id=2).delete()
    models.Author.objects.get(id=3).delete()
    

    更新数据

    models.Author.objects.filter(id=5).update(
            name='崔老师',
            age=16,
            authorDetail=models.AuthorDetail.objects.get(id=5),
            authorDetail_id=4,
         )
    

    一对多关系

    xx = models.ForeignKey(to='表名',to_field='字段名',on_delete=models.CASCADE)
    

    增加数据

    方式1

    外键关联的直接赋值为某个对象即可

    obj = models.Publish.objects.get(id=1)
    models.Book.objects.create(
        title='李帅',
        publishDate='2019-07-22',
        price=3,
        publishs=obj
    )
    

    方式2

    obj = models.Publish.objects.get(id=1)
    models.Book.objects.create(
            title='李帅test',
            publishDate='2019-07-22',
            price=3.5,
            publishs_id=1 #可以是整型,也可以是对象的属性(id)
            #publishs_id=obj.id
        )
    

    删除数据

    models.Publish.objects.get(id=1).delete()
    models.Book.objects.get(nid=1).delete()
    

    更新数据

    models.Book.objects.filter(pk=4).update(
    title='B哥的往事2',
    publishs=models.Publish.objects.get(id=3),
    publishs_id=3, #注意级联关系 不能乱改
    	)
    

    多对多关系

    xx = models.ManyToManyField(to='另外一个表名') #这是自动创建第三表
    

    添加数据

    book_obj = models.Book.objects.get(nid=1)
        book_obj.authors.add(*[1,2])
    

    删除数据

    book_obj = models.Book.objects.get(nid=6)
    book_obj.authors.remove(6)#将某个特定的对象从被关联对象集合中去除。
    book_obj.authors.remove(*[5,6])
    book_obj.authors.clear() #情况与nid 6相关联的所有
    book_obj.authors.add(*[1,])#添加表记录
    book_obj.authors.set('1')#先清空然后在设置
    book_obj.authors.set(['5','6']) #删除然后更新
    

    示例

    from django.db import models
    
    # Create your models here.
    
    from django.db import models
    
    # Create your models here.
    #作者表
    class Author(models.Model): #比较常用的信息放到这个表里面
        name=models.CharField( max_length=32)
        age=models.IntegerField()
        # authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)
        authorDetail=models.OneToOneField(to='AuthorDetail')  #一对一到AuthorDetail表  生成为表字段之后,会自动变为authorDetail_id这样有一个名称
    
        # 外键字段 -- 外键字段名_id
    
        # foreign+unique
    
        def __str__(self):
            return self.name
    
    #作者详细信息表
    class AuthorDetail(models.Model):
        birthday=models.DateField()
        # telephone=models.BigIntegerField()
        telephone=models.CharField(max_length=32)
        addr=models.CharField( max_length=64)
        def __str__(self):
            return self.addr
    
    
    #出版社表   和 书籍表 是 一对多的关系
    class Publish(models.Model):
        name=models.CharField( max_length=32)
        city=models.CharField( max_length=32)
        email=models.EmailField()  #charfield -- asdfasdf
        def __str__(self):
            return self.name
    
    #书籍表
    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField( max_length=32)
        publishDate=models.DateField()
        price=models.DecimalField(max_digits=5,decimal_places=2)  #decimal(16,2)
        publishs=models.ForeignKey(to="Publish")
        authors=models.ManyToManyField(to='Author',)
    
        def __str__(self):
            return self.title
    
  • 相关阅读:
    Changing Icon File Of Push Button At Runtime In Oracle Forms 6i
    Set Font Properties On Mouse Hover Of Push Button And Text Items At Run time In Oracle Forms
    Change An Item Property Using Set_Item_Property In Oracle Forms
    Calling / Running a report in Oracle forms 10g / 11g
    Change Or Set Report Object Property At Run Time In Oracle Forms Using Set_Report_Object_Property Command
    Refresh / Updating a form screen in Oracle D2k Forms 6i
    Know How And When To Use System.Message_Level To Control Messages In Oracle Forms
    Perform Cut Copy Paste Operations Using Cut_Region Copy_Region Paste_Region Commands In Oracle Forms
    CHECKBOX_CHECKED built-in in Oracle D2k Forms
    Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms
  • 原文地址:https://www.cnblogs.com/antmoe/p/12233311.html
Copyright © 2011-2022 走看看