加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django基础5.1,模型层(二)多表操作

发布时间:2020-12-20 10:30:27 所属栏目:Python 来源:网络整理
导读:Django5.1 ? 创建模型 建立下列模型 # 作者表 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) autho

Django5.1

?

创建模型

建立下列模型

# 作者表
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",)
    # 取消级联 on_delete=models.SET_NULL
    # 默认是级联的 on_delete=models.CASCADE 二以上版本是需要手动添加

    def __str__(self):
        return self.name

# 作者详细信息表
class AuthorDetail(models.Model):
    birthday=models.DateField() # 出生日期
    # telephone=models.BigIntegerField()  # 电话
    telephone=models.CharField(max_length=12)  # 电话
    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()

    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)
    publish=models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)
    authors=models.ManyToManyField(to=Author,)

    def __str__(self):
        return self.title

?

?

添加表记录

?一对一添加记录

# 方式一
# 先创建关系数据 绑定作者信息进行添加
publish_obj = models.AuthorDetail.objects.create(
    birthday=1997-02-13,telephone=17233145632,addr=齐齐哈尔,)
models.Author.objects.create(
    name=张起灵,age=88,authorDetail=publish_obj
)

# 方式二
# 绑定已有的数据,先找到,在创建
obj = models.AuthorDetail.objects.filter(addr=东银).first()
models.Author.objects.create(
    name=西楚霸王,age=45,authorDetail=obj,)

?一对多添加记录

# 方式一
obj = models.Publish.objects.get(pk=3)
models.Book.objects.create(
    title=帅总修仙传,publishDate=2011-11-21,price=124,publish=obj,)

# 方式二
obj = models.Publish.objects.get(pk=2)
models.Book.objects.create(
    title=三胖修仙传,publishDate=2013-11-21,price=164,publish_id=obj.pk,)

?

?

多对多添加记录

# 方式一 常用
book_obj = models.Book.objects.get(pk=14)
book_obj.authors.add(*[7,8]) # 添加两位作者

# 方式二
# 先找到作者1和作者2 然后对作者对象进行打散添加
author1 = models.Author.objects.get(pk=12)
author2 = models.Author.objects.get(pk=13)
book_obj = models.Book.objects.get(pk=15)
book_obj.authors.add(*[author1,author2])

?

?

删除表记录

# 一对一 表一外键关联表二 表一删除 不影响表二 表二删除会影响表二(连带删除)
models.AuthorDetail.objects.get(id=3).delete()
models.Author.objects.get(id=2).delete()

# 一对多
models.Publish.objects.get(id=1).delete()
models.Book.objects.get(nid=6).delete()

# 多对多 表关系删除
book_obj = models.Book.objects.get(nid=12)
book_obj.authors.remove(8)    # 删除一条
book_obj.authors.remove(*[8,9])    # 删除多条

book_obj.authors.clear()      # 删除所有关系(清空) 
book_obj.authors.set("9")       # 清空再修改
book_obj.authors.set([9,10])       # 清空再修改

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读