" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
Web

Django 创建 使用多对多关系

PySuper
2020-08-24 / 0 评论 / 0 点赞 / 9 阅读 / 4558 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

一、三种方式

全自动(不推荐)

  • 优点:django orm会自动创建第三张表
  • 缺点:只会创建两个表的关系字段,不会再额外添加字段,可扩展性差
class Book(models.Model):
    # ...
    authors = models.ManyToManyField(to='Author')
    
class Author(models.Model):
    # ...
    pass

纯手动(不推荐)

  • 优点:第三张表可以根据自己的要求随意添加额外的字段
  • 缺点:orm在查询的时候,很多方法不支持,查询非常麻烦
class Book(models.Model):
    # ...
    pass
    
class Author(models.Model):
    # ...
    pass
    
class Book_Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    # ...
    pass

半自动

  • 优点:手动建表,但要告诉orm第三张表是自己建的,orm只需要提供查询方法
  • 缺点:虽然可以使用orm的查询方法,但不支持使用add(), set(), remove(), clear()
class Book(models.Model):
    # ...
    authors = models.ManyToManyField(
        to='Author', 
        through='Book_Author', 
        through_fields=('book', 'author')
    )

class Author(models.Model):
    # ...
    books = models.ManyToManyField(
        to='Book',
        through='Book_Author',
        through_fields=('author', 'book')
    )
    
class Book_Author(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    # ....

二、项目应用

models.py

class Num(models.Model):
    name = models.CharField(max_length=50, verbose_name='范围')

    class Meta:
        ordering = ['id']
        db_table = 'tb_value'
        verbose_name_plural = verbose_name = '频率'


class Key(models.Model):
    # 多对多的关系表
    num= models.CharField(verbose_name="值", max_length=25, null=True, blank=True)

    # 默认反向应用的名称是:(当前类名称小写)_set,可以用related_name来指定
    nums= models.ManyToManyField(
        Frequency, 
        db_table='tb_num_and_nums', 
        related_name="num_range", 
        verbose_name="取值范围"
    )

views.py

num_id_list = judge_num.judge(None, num)

# 写入数据库
key_obj = Audio(description=description, num=num)
key_obj.save()

for num_id in num_id_list:
    num_obj= Num.objects.get(id=num_id)
    keys_obj.num.add(num_obj)

ForeignKey参数设置

参数设置

  • to:关联的表
  • on_delete:当该表中的某条数据删除后,关联外键的操作
  • related_name:反查参数,设置后可以在被关联表中通过该字段反查外键所在表,默认:set_表名
  • to_field
    • 默认主键,因为mysql只支持主键作为外键,就算你没显式的创建主键,Django会给你自动创建,
    • 如果你是DB-first,且没创建主键:数据库默认使用隐藏字段:DB_ROW_ID作为主键

on_delete参数设置

  • CASCADE:级联删除,当关联表中的数据删除时,该外键也删除
  • PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
  • SET_NULL:
    • 置空模式,删除的时候,外键字段被设置为空
    • 前提就是blank=True, null=True,定义该字段的时候,允许为空。
  • SET_DEFAULT: 设置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
  • SET(): 自定义一个值,该值当然只能是对应的实体

参考:https://www.cnblogs.com/zj420255586/p/11761007.html

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区