Django学习17 -- ManytoManyField

news/2024/11/14 2:54:06/

1. ManyToManyField (参考:Django Documentation Release 4.1.4)

  • 类定义

    class ManyToManyField(to, **options)
  • 使用说明

    A many-to-many relationship. Requires a positional argument: the class to which the model is related, which works exactly the same as it does for ForeignKey, including recursive and lazy relationships. Related objects can be added, removed, or created with the field’ s RelatedManager.
    多对多(many-to-many)关系,所需位置参数:与model(模型)相关的类,其工作方式与ForeignKey相同,包括递归和惰性关系。相关对像可以通过字段的RelatedManager进行添加、删除或创建。
  • to

    models.ManyToManyField("self")
    When Django processes this model, it identifies that it has a ManyToManyField on itself.
    当Django处理这个模型时,被识别为自身的ManyToManyField。
  • 数据库定义

    Database Representation Behind the scenes, Django creates an intermediary join table to represent the many-to-many relationship. By default, this table name is generated using the name of the many-to-many field and the name of the table for the model that contains it. Since some databases don’ t support table names above a certain length, these table names will be automatically truncated and a uniqueness hash will be used, e.g. author_books_9cdf. You can manually provide the name of the join table using the db_table option.

    数据库后台表示,Django创建中间连接表来表示多对多关系。默认的表名使用模型包含的多对多字段的名称和表名生成。由于某些数据库不支持超长表名,这些表名将被自动截断,并使用唯一散列。可以使用表选项手工提供联接表名。

  • Options(字典变量)

    - related_name,关联对像返回的关联名
    - related_query_name,来自目标模型的反过滤名
    - limit_choices_to,字段可用选项(字典类型)
    - symmetrical
      The ManyToManyField is assumed to be symmetrical –that is, if I am your friend, then you are my friend. If you do not want symmetry in many-to-many relationships with self, set symmetrical to False. This will force Django to add the descriptor for the reverse relationship, allowing ManyToManyField relationships to be non-symmetrical.
      假设ManyToManyField是对称的 -- 也就是说,如果我是你的朋友,那么你也是我的朋友。如果您不希望多对多关系中的自对称,设置symmetrical为False。这样Django为此反向关系添加描述,允许ManyToManyField关系是非对称的。
    - through,指定要使用的特定模型(中间表)
    - through_fields,使用through时使用,确认所使用的表中字段,建立many-to-many关系,field应为关连表的外键
    - db_table,存储many-to-many数据的表名,不指定时自动关联自身模型表及字段
    - db_constraint,控制是否创建交互表之间的外键约束,默认True
    - swappable,交换模型下控制迁移框架的响应是否认配置进行,默认为 True

2. 实例

  • 表 Table

    - User 用户表:user_name, user_technique
    class User(models.Model): user_name = models.CharField('User', max_length=50,)user_technique = models.ManyToManyField(Technique,blank=True) def tech_list(self):return ', '.join([i.tech_name for i in self.user_technique.all()])def __str__(self):return self.user_nameclass Meta:managed = Falsedb_table = 'user'
    - Technique 技能表:tech_name, tech_type
    class Technique(models.Model):  tech_name = models.CharField('TechniqueName', max_length=50, )tech_type = models.CharField('TechniqueType', max_length=20, choices=chol.techtype_list, )def __str__(self):return self.tech_namedef user_list(self):return ', '.join([i.user_name_id for i in self.user_set.all()])class Meta:managed = Falsedb_table = 'technique'
    -  User_user_technique,User 与 Techique关联表:technique_id, user_id
    约束:User表通过user_technique与Technique表的tech_name关联,多对多关系:一个user可以拥有多项technique,一项technique可以属于多个不同的user
  • 表Model特别说明
    # user table# 通过User_user_technique表形成manytomany关系user_technique = models.ManyToManyField(Technique,blank=True)# user表中user_technique 与 technique表中tech_name关联,定义新的字段tech_list列表显示user所拥有的techinque,添加到Admin的userAdmin的list_displaydef tech_list(self):return ', '.join([i.tech_name for i in self.user_technique.all()])# technique table# 反向访问user表,定义新字段user_list列表显示technique所归属的user,添加到Admin的techniqueAdmin的list_displaydef user_list(self):return ', '.join([i.user_name_id for i in self.user_set.all()])
  • 界面效果

4. 关于through  和 through_field (待深入学习)

    一般通过系统自动生成的manytomany关系可以满足基本的需要,如果有特殊要求可以通过自定义的关联关系实现特定要求。

# 自定义manytomany关联te_check = models.ManyToManyField('self',through='relationship',   # 自定义关联表symmetrical=False,through_fields=('user_name', 'tech_name',),  # 自定义表字段related_name='tech_name')

3. Errors List

  • (admin.E109) The value of 'list_display[10]' must not be a ManyToManyField.
    admin.py中的fileld_list列表中,ManyToManyField字段不能显示在内
  • because that field manually specifies a relationship model
    通过系统自动生成的manytomany关系的field无法再使用自动义的第 3 张关联表进行manatomany匹配,字段必须重新定义并与自定义的第 3 张表关联
     

4. 参考

Django Documentation 4.1.4
 


http://www.ppmy.cn/news/30138.html

相关文章

Qt安装与使用经验分享;无.pro文件;无QTextCodec file;Qt小试;界面居中;无缝;更换Qt图标;更换Qt标题。

1、切换安装下载源 《Qt安装教程》先推荐一篇安装文章:《Qt安装教程》 Qt 5.15 之后已经不提供离线安装包了,就是那个 3.7G 的 exe 安装包。请看官方说明,所以只能用在线安装包。 1,下载在线安装包 QT 在线安装包链接&#xff…

【第二章】谭浩强C语言课后习题答案

1. 什么是算法?试从日常生活中找3个例子,描述它们的算法 算法:简而言之就是求解问题的步骤,对特定问题求解步骤的一种描述。 比如生活中的例子: 考大学首先填报志愿表、交报名费、拿到准考证、按时参加考试、收到录取通知书、按照日期到指定学校报到。 去北京听演唱会首先…

为什么人们宁可用Lombok,也不把成员设为public?

目录专栏导读一、从零了解JavaBean1、基本概念2、JavaBean的特征3、JavaBean的优点二、定义最简单的JavaBean三、思考一个问题,为何属性是private,然后用get/set方法?四、下面系统的分析以下,why?五、不和谐的声音,禁…

企业选择人力资源管理系统(HRMS)的一些建议

HR管理系统,全称为人力资源管理系统(HRMS)。企业选择HR管理系统,首先要了解这个系统是什么。 什么是HRMS? 一个人力资源管理系统,通常简称为人力管理系统,是一个软件应用程序,使人力…

二分查找与判定树

二分查找的算法思想二分查找也称“折半查找”,要求查找表为采用顺序存储结构的有序表。本例一律采用升序排列。二分查找每一次都会比较给定值与序列[low,high]的中间元素,该元素的下标为mid (lowhigh)/2,若两者相等,则返回元素的下标为mid;如…

constexpr 和 常量表达式

👀👀常量表达式 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。 字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。 那么是什么来就决定是不是常量表达式呢?一个对象是不是常量表达式主要…

高码率QPSK调制解调方案(FPGA实现篇)

在前面的章节中,已经讲过QPSK调制的方案和Matlab算法仿真,在本篇中,主要讲解基于FPGA的高速QPSK调制的实现。根据前面提到的技术指标,本系统传输的数据速率为500Mbps,中频为720MHz,因此,传统的串行QPSK调制已经不合适在FPGA中实现,需采用全数字的并行方式进行调制,具体…

Java面向对象:多态特性的学习

本文介绍了Java面向对象多态特性, 多态的介绍. 多态的实现条件–1.发生继承.2.发生重写(重写与重载的区别)3.向上转型与向下转型.4.静态绑定和动态绑定5. 实现多态 举例总结多态的优缺点 避免在构造方法内调用被重写的方法… Java面向对象:多态特性的学习一.什么是多态?二.多态…