Python - Django - ORM-many operation

models.py:

from django.db import models


# 出版社
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64, null=False, unique=True)

    def __str__(self):
        return "<Publisher object: {}>".format(self.name)


# 书籍
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, null=False, unique=True)
    publisher = models.ForeignKey(to="Publisher")

    def __str__(self):
        return "<Book object: {}>".format(self.title)


# 作者
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    = models.CharField name (= 16 max_length, null = False, UNIQUE = True) 
    Book = models.ManyToManyField (to = "Book") #-many association Book table, ORM will automatically generate the first three tables 

    def __str __ (self ): 
        return "<Object the Author: {}>." the format (the self.name)

book table:

author table:

author and associated third table book, author_book table:

publisher table:

 

Many to many query:

orm.py:

os Import 

IF __name__ == '__main__': 
    # load Django project configuration information 
    os.environ.setdefault ( "DJANGO_SETTINGS_MODULE", "mysite2.settings") 
    # import Django, Django project and start the 
    Import Django 
    django.setup () 

    from app01 Models Import 

    author_obj = models.Author.objects.get (id = 2) to obtain the id of # 2 
    ret = author_obj.book.all () # id query all the books written by the author of 2 
    print (ret)

operation result:

 

create():

Create a new object, saving the object, and add it to the associated object set in, returns the newly created object.

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    author_obj = models.Author.objects.get(id=1)  # 获取 id 为 1 的作者
    author_obj.book.create(title="《PHP》", publisher_id=2)  # 通过该作者创建一本书

运行结果:

 

add():

把指定的 model 对象添加到关联对象集中

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 把 id 为 2 的书添加给 id 为 4 的作者
    author_obj = models.Author.objects.get(id=4)
    book_obj = models.Book.objects.get(id=2)
    author_obj.book.add(book_obj)
    
    # 也可以直接使用 id 添加
    # author_obj.book.add(2)

运行结果:

添加多个

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 添加多个,把 id 大于 4 的书添加给 id 为 3 的作者
    author_obj = models.Author.objects.get(id=3)
    book_objs = models.Book.objects.filter(id__gt=4)
    author_obj.book.add(*book_objs)   # 要用 * 把列表打散再传进去

运行结果:

 

remove():

从关联对象集中移除执行的 model 对象。

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    author_obj = models.Author.objects.get(id=3)
    book_obj = models.Book.objects.get(title="《PHP》")
    author_obj.book.remove(book_obj)  # 删除与 title 字段为 《PHP》 的关联
    author_obj.book.remove(5)  # 直接删除

运行结果:

原先 id 为 3 的作者关联的两本书籍本删除了

 

clear():

从关联对象集中清空一切对象。

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 把 id 为 4 的作者的书籍全清空
    author_obj = models.Author.objects.get(id=4)
    author_obj.book.clear()

运行结果:

author_id=4 的内容全被清空了

 

set():

更新 model 对象的关联对象。

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 给 id 为 4 的作者添加 id 为 2、3 的两本书
    author_obj = models.Author.objects.get(id=4)
    author_obj.book.set([2, 3])

运行结果:

 

外键补充:

外键中的 clear() 和 remove() 方法只能在 null=True 时用

models.py 中的 Book 类:

# 书籍
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, null=False, unique=True)
    publisher = models.ForeignKey(to="Publisher", null=True)  # 把 null 设置为 True

    def __str__(self):
        return "<Book object: {}>".format(self.title)

orm.py:

import os

if __name__ == '__main__':
    # 加载 Django 项目的配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
    # 导入 Django,并启动 Django 项目
    import django
    django.setup()

    from app01 import models

    # 清空 id 为 2 的出版社中的书籍
    publisher_obj = models.Publisher.objects.get(id=2)
    publisher_obj.book_set.clear()

运行结果:

publisher_id 为 2 全变为 0

Guess you like

Origin www.cnblogs.com/sch01ar/p/11299321.html