创建表

from django.db import models

# Create your models here.
"""
你在写orm语句的时候 跟你写sql语句一样
不要想着一次性写完
写一点查一点看一点
"""



class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)

    # 书籍与出版社 是一对多关系
    publish = models.ForeignKey(to='Publish')
    # 书籍与作者 是多对多
    authors = models.ManyToManyField(to='Author')
    """
    authors虚拟字段
        1.告诉orm自动帮你创建第三张关系表
        2.orm查询的时候  能够帮助你更加方便的查询
    """

    def __str__(self):
        return self.title


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)

    def __str__(self):
        return self.name
    """return返回的数据必须是字符串类型"""



class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # author_detail = models.ForeignKey(unique=True,to='AuthorDetail')
    author_detail = models.OneToOneField(to='AuthorDetail')


    def __str__(self):
        return self.name

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

    def __str__(self):
        return self.addr


一对多字段增删改查

#增
models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)

publish_obj=models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj)
#查
book_obj=models.Book.object.filter(pk=1).first()
print(book_obj.publish)  # 获取到当前所对应的出版社对象
print(book_obj.publish_id)  # 获取到的就是表中的实际字段
#改
models.Book.objects.filter(pk=1).update(publish_id=3)

publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)
#删除
models.Publish.object.filter(pk=2).delete()
 # 默认也是级联更新 级联删除

多对多字段的四个方法

#增
# 给主键为3的书籍添加两个作者 1 2
book_obj = models.Book.objects.filter(pk=3).first()
#print(book_obj.authors)  # 就相当于 已经在书籍和作者的关系表了
#book_obj.authors.add(1)
#book_obj.authors.add(2,3)
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
#book_obj.authors.add(author_obj)
book_obj.authors.add(author_obj,author_obj1)

"""
add() 括号内既可以传数字也可以传数据对象
并且都支持传多个
"""
#改
book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.set([3,])
# book_obj.authors.set([1,3])
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.set((author_obj,))
book_obj.authors.set((author_obj,author_obj1))

"""
set() 括号内 既可以传数字也传对象 
并且也是支持传多个的
但是需要注意 括号内必须是一个可迭代对象
"""
#删
book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.remove(2)
# book_obj.authors.remove(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj1)
    """
    remove() 括号内 既可以传数字也传对象 
    并且也是支持传多个的
    """
#清空
book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.clear()
"""clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""

posted on 2019-10-24 19:40  黑糖A  阅读(211)  评论(0编辑  收藏  举报