Django ORM多表操作

1、表与表之间的关系

一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面
一对多(ForeignKey):一对多字段建在多的那一方
多对多(ManyToManyField):多对多字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面

ps:如何判断表与表之间到底是什么关系:
    换位思考
        A能不能有多个B
        B能不能有多个A

2、创建各个表

# 以图书管理系统为例,创建表

#modele.py文件
# 图书
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')

# 出版社
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
    email= models.EmailField()

# 作者
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 一对一
    authordetail = models.OneToOneField(to='AuthorDetail')

# 作者信息
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

改动modele.py文件后 需要执行以下命令:

python3 manage.py makemigrations 
python3 manage.py migrate

3、多对多字段增删改查

#------------------------------
# 给书籍绑定与作者之间的关系
#添加关系 add:支持传数字或对象,并且都可以传多个

book_obj = models.Book.objects.filter(pk=3).first()
# 给id为3的书籍对象,添加一个对应authors为1的关系,这种关系会被记录到app01_book_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=3).first() # book_obj.authors.add(author_obj) book_obj.authors.add(author_obj,author_obj1) #------------------------------ # 修改书籍与作者的关系 set() set传的必须是可迭代对象!!! # 可以传数字和对象,并且支持传多个 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set((1,)) book_obj.authors.set((1,2,3)) author_list = models.Author.objects.all() book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set(author_list) #------------------------------ # 删除书籍与作者的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.remove(1) book_obj.authors.remove(2,3) #删一个对象 author_obj = models.Author.objects.all().first() book_obj.authors.remove(author_obj) #删多个对象 author_list = models.Author.objects.all() book_obj.authors.remove(*author_list) # 需要将queryset打散 #------------------------------ # 清空 clear() 清空的是你当前这个表记录对应的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.clear()
原文地址:https://www.cnblogs.com/weiyiming007/p/12362408.html