• django 多表操作


    三种关系   一对一,一对多,多对多

    创建表

     1 一对一
     2     xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE)  #删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除的,2.x版本的django要写.
     3     
     4 一对多
     5     xx = models.ForeignKey(to='表名',to_field='字段名',on_delete=models.CASCADE)
     6 多对多
     7     xx = models.ManyToManyField(to='另外一个表名') #这是自动创建第三表
     8     
     9 示例
    10     from django.db import models
    11 
    12 # Create your models here.
    13 
    14 from django.db import models
    15 
    16 # Create your models here.
    17 #作者表
    18 class Author(models.Model): #比较常用的信息放到这个表里面
    19     name=models.CharField( max_length=32)
    20     age=models.IntegerField()
    21     # authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)
    22     authorDetail=models.OneToOneField(to='AuthorDetail')  #一对一到AuthorDetail表  生成为表字段之后,会自动变为authorDetail_id这样有一个名称
    23 
    24     # 外键字段 -- 外键字段名_id
    25 
    26     # foreign+unique
    27 
    28     def __str__(self):
    29         return self.name
    30 
    31 #作者详细信息表
    32 class AuthorDetail(models.Model):
    33     birthday=models.DateField()
    34     # telephone=models.BigIntegerField()
    35     telephone=models.CharField(max_length=32)
    36     addr=models.CharField( max_length=64)
    37     def __str__(self):
    38         return self.addr
    39 
    40 
    41 #出版社表   和 书籍表 是 一对多的关系
    42 class Publish(models.Model):
    43     name=models.CharField( max_length=32)
    44     city=models.CharField( max_length=32)
    45     email=models.EmailField()  #charfield -- asdfasdf
    46     def __str__(self):
    47         return self.name
    48 
    49 #书籍表
    50 class Book(models.Model):
    51     nid = models.AutoField(primary_key=True)
    52     title = models.CharField( max_length=32)
    53     publishDate=models.DateField()
    54     price=models.DecimalField(max_digits=5,decimal_places=2)  #decimal(16,2)
    55     publishs=models.ForeignKey(to="Publish")
    56     authors=models.ManyToManyField(to='Author',)
    57 
    58     def __str__(self):
    59         return self.title
    60 
    61 #手动创建第三张表,暂时忽略
    62 # class BookToAuthor(models.Model):
    63 #     book_id = models.ForeignKey(to='Book')
    64 #     author_id = models.ForeignKey(to='Author')
    65 #     # xx = models.CharField(max_length=12)

    增删改查

     1 #1 增
     2     #1.1 一对一增加
     3     # new_author_detail = models.AuthorDetail.objects.create(
     4     #     birthday='1979-08-08',
     5     #     telephone='138383838',
     6     #     addr='黑龙江哈尔滨'
     7     # )
     8     # obj = models.AuthorDetail.objects.filter(addr='山西临汾').first()
     9 
    10     #方式1
    11     # models.Author.objects.create(
    12     #     name='王涛',
    13     #     age='40',
    14     #     authorDetail=new_author_detail,
    15     # )
    16     # 方式2  常用
    17     # models.Author.objects.create(
    18     #     name='王涛',
    19     #     age='40',
    20     #     authorDetail_id=obj.id,
    21     # )
    22 
    23     # 一对多
    24     #方式1
    25     # obj = models.Publish.objects.get(id=2)
    26     # models.Book.objects.create(
    27     #     title = '李帅的床头故事',
    28     #     publishDate='2019-07-22',
    29     #     price=3,
    30     #     # publishs=models.Publish.objects.get(id=1),
    31     #     publishs=obj,
    32     #
    33     # )
    34     # 方式2 常用
    35     # models.Book.objects.create(
    36     #     title='李帅的床头故事2',
    37     #     publishDate='2019-07-21',
    38     #     price=3.5,
    39     #     # publishs=models.Publish.objects.get(id=1),
    40     #     publishs_id=obj.id
    41     #
    42     # )
    43 
    44     # 多对多
    45     # 方式1   常用
    46     # book_obj = models.Book.objects.get(nid=1)
    47     # book_obj.authors.add(*[1,2])
    48     # 方式2
    49     # author1 = models.Author.objects.get(id=1)
    50     # author2 = models.Author.objects.get(id=3)
    51     # book_obj = models.Book.objects.get(nid=5)
    52     # book_obj.authors.add(*[author1,author2])

     1 一对一和一对多的删除和单表删除是一样的
     2 # 一对一  表一外键关联到表二,表一删除,不影响表2,表2删除会影响表1
     3     # models.AuthorDetail.objects.get(id=2).delete()
     4     # models.Author.objects.get(id=3).delete()
     5 
     6     # 一对多
     7     # models.Publish.objects.get(id=1).delete()
     8     # models.Book.objects.get(nid=1).delete()
     9 
    10     # 多对多关系删除
    11     # book_obj = models.Book.objects.get(nid=6)
    12     # book_obj.authors.remove(6)
    13     # book_obj.authors.remove(*[5,6])
    14     # book_obj.authors.clear()
    15     # book_obj.authors.add(*[1,])
    16     # book_obj.authors.set('1')
    17     # book_obj.authors.set(['5','6']) #删除然后更新

    更新

     1  # 更新
     2     # 一对一
     3     # models.Author.objects.filter(id=5).update(
     4     #     name='崔老师',
     5     #     age=16,
     6     #     # authorDetail=models.AuthorDetail.objects.get(id=5),
     7     #     authorDetail_id=4,
     8     # )
     9     #一对多
    10     # models.Book.objects.filter(pk=4).update(
    11     #     title='B哥的往事2',
    12     #     # publishs=models.Publish.objects.get(id=3),
    13     #     publishs_id=3,
    14     # )
    15     
    16     #一对多
    17     models.Publish.objects.filter(pk=2).update(
    18         id=4, # 没有级联更新,报错!!
    19     )
  • 相关阅读:
    C. Tavas and Karafs 二分查找+贪心
    字符串前缀和后缀匹配
    E
    网络流最经典的入门题 各种网络流算法都能AC。 poj 1273 Drainage Ditches
    B
    Dividing 多重背包 倍增DP
    Doing Homework 状态压缩DP
    Largest Rectangle in a Histogram 常用技巧 stack的运用
    S = A + A2 + A3 + … + Ak. (推矩阵公式+矩阵幂运算)
    安卓开发:图片的显示Mode
  • 原文地址:https://www.cnblogs.com/ch2020/p/13130287.html
Copyright © 2020-2023  润新知