Django ORM之多对多三种创建方式

阅读目录

Django ORM多对多的三种模式

  1. 使用默认的ManyToManyField创建第三张表、
  2. 自己创建第三张关系表
    3.自己创建第三张表,在ManyToManyField中通过through和through_fields指定表名和字段

回到顶部
Django ORM多对多的三种模式

  1. 使用默认的ManyToManyField创建第三张表、
  2. 优势
    可以使用ORM提供的快捷方法
    add()
    clear()
    set()
    remove()
    all()
  3. 劣势:
    不能扩展第三张表

复制代码
from django.db import models

Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32)

def __str__(self):
    return self.title

class Author(models.Model):
name = models.CharField(max_length=32, verbose_name=“作者姓名”)
books = models.ManyToManyField(to=‘Book’)

def __str__(self):
    return self.name

复制代码

复制代码
#!/usr/bin/env python

-- coding:utf8 --

import os

if name == ‘main’:
os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “manytomany_test.settings”)
import django
django.setup()

from app01 import models

author_obj = models.Author.objects.get(id=1)
ret = author_obj.books.all()
print(ret)

# from app02 import models
#
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.author2book_set.all().values_list("book__title")
# print(ret)

# from app03 import models
# 
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.books.all()
# print(ret)
# 删除第一个作者关联的所有书籍,可以直接操作第三张关系表
# models.Author2Book.objects.filter(author=author_obj).delete()

复制代码
2. 自己创建第三张关系表

  1. 优势:
    可以自己扩展第三章关系表的字段(婚恋网站的男女用户的约会记录)
  2. 劣势:
    不能使用ORM提供的快捷方法(查询麻烦,需要跨三张表)

复制代码
from django.db import models

Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name=“书名”)

def __str__(self):
    return self.title

class Author(models.Model):
name = models.CharField(max_length=32, verbose_name=“作者姓名”)

def __str__(self):
    return self.name

自己创建多对多的第三张表

class Author2Book(models.Model):
book = models.ForeignKey(to=‘Book’)
author = models.ForeignKey(to=‘Author’)

class Meta:
    unique_together = (('book', 'author'), )

复制代码

复制代码
#!/usr/bin/env python

-- coding:utf8 --

import os

if name == ‘main’:
os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “manytomany_test.settings”)
import django
django.setup()

# from app01 import models
# 
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.books.all()
# print(ret)

from app02 import models

author_obj = models.Author.objects.get(id=1)
ret = author_obj.author2book_set.all().values_list("book__title")  # 先是外键反向查询, 在是外键正向查询
print(ret)

# from app03 import models
#
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.books.all()
# print(ret)
# 删除第一个作者关联的所有书籍,可以直接操作第三张关系表
# models.Author2Book.objects.filter(author=author_obj).delete()

复制代码
3.自己创建第三张表,在ManyToManyField中通过through和through_fields指定表名和字段

  1. 优势:
    可以使用ORM提供的部分快捷方法
    all()
    可以扩展第三张关系表的字段

复制代码
from django.db import models

Create your models here.

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name=“书名”)

def __str__(self):
    return self.title

class Author(models.Model):
name = models.CharField(max_length=32, verbose_name=“作者姓名”)
books = models.ManyToManyField(
to=‘Book’,
through=‘Author2Book’,
through_fields=(‘author’, ‘book’) # 这里是有顺序的,在那个表种写关联,那个字段就要写的前面
)

def __str__(self):
    return self.name

自己创建多对多的第三张表

class Author2Book(models.Model):
book = models.ForeignKey(to=‘Book’)
author = models.ForeignKey(to=‘Author’)

class Meta:
    unique_together = (('book', 'author'),)

复制代码

复制代码
#!/usr/bin/env python

-- coding:utf8 --

import os

if name == ‘main’:
os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “manytomany_test.settings”)
import django
django.setup()

# from app01 import models
#
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.books.all()
# print(ret)

# from app02 import models
# 
# author_obj = models.Author.objects.get(id=1)
# ret = author_obj.author2book_set.all().values_list("book__title")  # 先是外键反向查询, 在是外键正向查询
# print(ret)

from app03 import models

author_obj = models.Author.objects.get(id=1)
ret = author_obj.books.all()  # 只可使用多对多关系种的all()方法
print(ret)

# 删除第一个作者关联的所有书籍,可以直接操作第三张关系表
models.Author2Book.objects.filter(author=author_obj).delete()

复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值