首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django:使用related_name添加2个引用同一表的外键,导致NameError -未定义指定给相关名称的值

Django是一个开源的Python Web框架,它提供了一种快速开发高质量Web应用程序的方式。在Django中,可以使用related_name参数来为模型中的外键字段添加自定义的反向引用名称。

当一个模型中有多个外键字段引用同一张表时,可以使用related_name参数来避免冲突。该参数允许我们为每个外键字段指定一个唯一的反向引用名称,以便在查询时能够准确地引用到对应的字段。

在Django中,当使用related_name参数时,需要注意以下几点:

  1. related_name参数应该在外键字段的定义中进行设置,而不是在被引用的模型中。
  2. related_name参数的值应该是一个字符串,用于指定反向引用的名称。
  3. related_name参数的值应该是唯一的,以避免冲突。

下面是一个示例,演示如何使用related_name参数来添加两个引用同一表的外键:

代码语言:txt
复制
from django.db import models

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

class Author(models.Model):
    name = models.CharField(max_length=100)
    book1 = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='authors1')
    book2 = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='authors2')

在上面的示例中,Author模型有两个外键字段book1和book2,它们都引用了Book模型。通过使用related_name参数,我们为每个外键字段指定了不同的反向引用名称,分别是'authors1'和'authors2'。

这样,在查询Author模型时,我们可以使用这些反向引用名称来获取对应的Book对象。例如:

代码语言:txt
复制
author = Author.objects.get(id=1)
books1 = author.authors1.all()
books2 = author.authors2.all()

在上面的示例中,我们通过author对象的反向引用名称'authors1'和'authors2'分别获取了book1和book2所对应的Book对象。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django模型最佳实践

模型定义参考 字段 对字段名称限制 字段名不能是Python保留字,否则会导致语法错误 字段名不能有多个连续下划线,否则影响ORM查询操作 Django模型字段类 字段类 说明 AutoField...unique 设置为True时,表中字段必须是唯一 verbose_name 字段在后台模型管理显示名称,未指定时使用字段名称 ForeignKey属性 limit_choices_to:是一个...db_constraint:是否为创建约束,默认为True。...on_delete:关联对象被删除时对应动作,可取包括django.db.models中定义: CASCADE:级联删除。...PROTECT:抛出ProtectedError异常,阻止删除引用对象。 SET_NULL:把设置为null,当null属性被设置为True时才能这么做。

2.3K40

django 1.8 官方文档翻译:2-1-1 模型语法

中介模型有一些限制: 中介模型必须有且只有一个到源模型(上面例子中Group),或者你必须使用ManyToManyField.through_fields 显式指定Django 应该使用。...Changed in Django 1.7: 在Django 1.6 及之前版本中,中介模型禁止包含多于一个。...和使用 ForeignKey一样,你可以定义_ 递归关联关系和引用未定义关系模型。详见模型字段参考_。 另见 在一对一关系模型例子 中有一套完整例子。...跨文件模型 访问其他应用模型是非常容易。 在文件顶部你定义模型地方,导入相关模型来实现它。然后,无论在哪里需要的话,都可以引用它。...但在抽象基类上这样做就会引发一个很严重问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类字段属性都完全相同 (这里面就包括related_name)。

5K20
  • Django 学习笔记之模型高级用法(上)

    通常不需要直接使用它,如果表中没有设置主键时,Django 将会自动添加一个自增主键。BigAutoField 其实也是一个 BigIntegerField,但它支持 ID 自动增长。...2.1 ForeignKey 1) on_delete 在 Django 2.0 中,设置时需要添加一个 on_delete选项。本身涉及到两个表数据,况且在数据库中是有约束行为。...SET_DEFAULT: 置默认,删除时候,字段设置为默认,所以定义时候注意加上一个默认。 SET(): 自定义对应实体。...2)limit_choices_to 该参数用于限制所能关联对象,只能用于 Django ModelForm(Django表单模块)和 admin 后台,对其它场合无限制功能。...4) related_name 用于关联对象反向引用模型名称。主要用于反向查询,即源模型实例通过管理器返回第一个模型所有实例。

    2K30

    django 1.8 官方文档翻译: 2-1-1 模型语法(初稿)

    使用模型 一旦你定义了模型,就要通知Django启用这些模型,你要做就是修改配置文件中INSTALLED_APPS 设置,在其中添加models.py所在应用名称。...和使用 ForeignKey 一样,你可以定义 递归关联关系(recursive relationship) 和 引用未定义关系 model (references to as-yet undefined...然而如果将它做为其他 model 基类,那么该类字段就会被添加到子类中。抽象基类和子类如果含有同名字段,就会导致错误(Django 将抛出异常)。...小心使用 related_name 如果你在 ForeignKey 或 ManyToManyField 字段上使用 related_name 属性,你必须总是为该字段指定一个唯一反向名称。...但在抽象基类上这样做就会引发一个很严重问题。因为 Django 会将基类字段添加到每个子类当中,而每个子类字段属性都完全相同 (这里面就包括 related_name)。

    3.1K30

    Django之ForeignKey和ManyToManyField多表查询

    只有在db_constraint=True时Django model才会在数据库上建立约束, 在该为False时不建立约束. 默认db_constraint=True....被索引关系模型可以访问所有参照它模型实例,如Entry.blog作为Blog,默认情况下Blog.entry_set是包含所有参照BlogEntry示例查询集,可以使用查询集API取出相应实例...在这种情况下,必须使用through_fields 明确指定Django 应该使用哪些 through_fields 接收一个二元组('field1', 'field2'),其中field1 为指向定义...ManyToManyField 字段模型名称(本例中为group),field2 为指向目标模型名称(本例中为person)....ManyToManyField.db_table 默认情况下,关联表名称使用多对多字段名称和包含这张表模型名称以及Hash生成,如:memberShip_person_3c1f5 若要想要手动指定表名称

    1.8K10

    Django(15)和表关系

    大家好,又见面了,我是你们朋友全栈君。 删除操作 如果一个模型使用。那么在对方那个模型被删掉后,该进行什么样操作。可以通过on_delete来指定。...如果那条数据被删除了,那么本条数据上就将这个字段设置为默认。如果设置这个选项,前提是要指定这个字段一个默认。 SET():如果那条数据被删除了。...那么将会获取SET函数中来作为这个。SET函数可以接收一个可以调用对象(比如函数或者方法),如果是可以调用对象,那么会将这个对象调用后结果作为返回回去。...并且FrontUser对象可以使用userextension来访问对应UserExtension对象。 如果不想使用Django默认引用属性名字。...在我们使用多对多反向引用添加时候,只能使用add这种添加方式,比如向文章中添加标签,示例代码如下: article = Article.objects.first() tag = Tag(name="

    2.1K40

    Django学习笔记之ORM多表操作

    注意事项:  表名称myapp_modelName,是根据 模型中元数据自动生成,也可以覆写为别的名称   id 字段是自动添加  对于字段,Django 会在字段名上添加"_id" 来创建数据库中列名...定义好模型之后,你需要告诉Django _使用_这些模型。你要做就是修改配置文件中INSTALL_APPSZ中设置,在其中添加models.py所在应用名称。...字段 ForeignKey 有一个 null=True 设置(它允许接受空 NULL),你可以赋给它空 None 。 添加表纪录  操作前先简单录入一些数据: publish表: ?...related_name 来覆写 FOO_set 名称。...名称是聚合标识符,是计算出来聚合名称是按照字段和聚合函数名称自动生成出来。如果你想要为聚合指定一个名称,可以向聚合子句提供它。

    2.8K40

    06.Django基础五之django模型层(二)多表操作

    注意事项: 表名称myapp_modelName,是根据 模型中元数据自动生成,也可以覆写为别的名称   id 字段是自动添加 对于字段,Django 会在字段名上添加"_id" 来创建数据库中列名...字段 ForeignKey 有一个 null=True 设置(它允许接受空 NULL),你可以赋给它空 None 。   ...但是我们就不能使用ORM相关方法了,所以我们单纯换成一个其他字段类型,只是单纯存着另外一个关联表主键值是不能使用ORM方法。...#db_constraint=False只加两者关系,没有强制约束效果,并且ORM相关接口(方法)还能使用,所以如果将来公司让你建立,并且不能有强制约束关系,那么就可以将这个参数改为False...名称是聚合标识符,是计算出来聚合名称是按照字段和聚合函数名称自动生成出来。如果你想要为聚合指定一个名称,可以向聚合子句提供它。

    2.7K20

    Django 模型继承 BaseModel

    Meta 继承 当一个抽象基类被建立,Django 将所有你在基类中申明 Meta 内部类以属性形式提供。若子类未定义自己 Meta 类,它会继承父类 Meta。...和 related_query_name 要格外小心 若你在 或 多对多字段 使用related_name 或 related_query_name,你必须为该字段提供一个 独一无二 反向名字和查询名字...然而,使用名字是 ForeignKey 和 ManyToManyField 关系默认。如果你在继承父类模型子类中添加了这些关联,你 必须 指定 related_name 属性。...重写一个被继承 Manager 所引用继承字段,可能会导致微妙错误。参见 自定义管理器和模型继承。...注解 某些字段在模型内定义了额外属性,例如 ForeignKey 定义了一个额外属性 _id 附加在字段名上,类似的还有 related_name 和 related_query_name。

    2.1K10

    基于Django OneToOneField和ForeignKey区别详解

    若数据库提高了引用完整性,则此种设置会抛出一个IntegrityError,除非对这一数据字段手动添加了SQL语句中ON DELETE字段 还可以通过设置abstract属性来定义一个抽象类: from...通过一个限制对字段信息某一可能选项进行约束,可以通过字典,函数或者查询来设置 related_name 可以指定关联类在本类中名称,通过这一参数可以用两个字段名引用同一个类,通过这个名称父类可以取得子类...,默认为字段名 related_query_name 用于filter函数过滤和values函数 to_field 关系关联相关对象名称 db_constraint 控制在数据库中是否应该建立这一字段约束...ManyToManyField类有两个经常使用参数:through和through_fields,通过这两个参数可以十分方便地建立中间项关联,如示例代码所示: from django.db import...ManyToManyField还有以下参数可以选择: 参数 功能 related_name ForeignKey,可以指定关联类在本类中名称 related_query_name ForeignKey

    2.5K20

    Django中基表创建、字段属性简介、脏数据概念、子序列化

    更合理) """ Django orm中外字段属性详解 在建表之前我们对外字段属性进行了解: 1)related_name在外中设置反向查询字段名:正向找字段名,反向找related_name...related_name默认是表名小写 + _set,这就是为什么在Django中跨表反向查询时我们使用表名小写 + _set去查另一张表数据。...SET_DEFAULT:假设A表依赖B表,B记录删除,A表字段重置为default属性设置,所以必须配合default属性使用。...将默认设置为空,反向查询字段名设置为book authors = models.ManyToManyField(to='Author', related_name='books...子序列化使用方法及注意事项: 1)只能在序列化中使用 2)字段名必须是(正向反向都可以)字段,相对于自定义序列化外字段,自定义序列化字段不能参与反序列化,而子序列化必须为键名,子序列化字段不写入数据库

    4.3K30

    Django——model基础

    myapp_modelName,是根据 模型中元数据自动生成,也可以覆写为别的名称   2、id 字段是自动添加 3、对于字段,Django 会在字段名上添加"_id" 来创建数据库中列名...5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做就是修改配置文件中INSTALL_APPSZ中设置,在其中添加models.py所在应用名称。...6、字段 ForeignKey 有一个 null=True 设置(它允许接受空 NULL),你可以赋给它空 None 。...名称是聚合标识符,是计算出来聚合名称是按照字段和聚合函数名称自动生成出来。如果你想要为聚合指定一个名称,可以向聚合子句提供它。 ?...在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 行为,换句话说,删除一个对象时也会删除与它相关对象。例如: ?

    1.1K100

    python测试开发django-37.(ForeignKey)查询

    前言 前面在admin后台页面通过设置,可以选择下拉框选项,本篇主要讲解关于(ForeignKey)查询 models设计 在上一篇基础上新增一个BankName表,Card表通过关联到...正向查询 根据Card表card_id,去查询关联对应BankName相关信息,这个相对来说简单一点 >>> from hello.models import BankName, Card >>>...反向查询,当ForeignKey没设置related_name参数,默认是通过关联表名称加_set去查询 查询结果是QuerySet集合对象 count()函数统计查询个数 [0].card_id 下标取值...当Card表(ForeignKey)只有一个时,可以通过_set去查询到,当有多个时,就无法查询具体哪个了,这时候就需要加个related_name参数。...参数相当于给这个取了个别名,方便多个时候去识别。

    1.6K20

    Django中ORM介绍和字段及其参数

    关系字段 ForeignKey   类型在ORM中用来表示关联关系,一般把ForeignKey字段设置在 '一对多'中'多'一方。   ...字段参数 to:设置要关联表 to_field:设置要关联字段 related_name:反向操作时,使用字段名,用于代替原反向查询时'表名_set'。...to="User", to_field="id", on_delete=models.SET(func) ) db_constraint:是否在数据库中创建约束...字段参数 to:设置要关联表; related_name:反向操作时,使用字段名,用于代替原反向查询时'表名_set'(ForeignKey字段)。...related_query_name:反向查询操作时,使用连接前缀,用于替换表名。意思是用于替换本类表名(ForeignKey字段)。

    2.8K80

    博客将 Django 1.11+ 升级到 Django 2.2+ 遇到问题及规避方法

    ,这个地方是说关于一些模型在一对一关联和一对多关联(时候需要指定 on_delete 参数才行,多对多没有这个设置。...因为在 Django 1.x 版本中,这个参数是有默认,但是 Django 2.x 没有指定,所以需要显示设定一个。...规避方法 把项目中所有模型中有字段都添加这个属性,添加时候需要根据实际情况设定。...报错分析,这个是 django 2.x 里面会出现问题,当 urls.py 里面使用 include 时候,当有 namespace 参数时候,第一个参数需要添加成元组,其中第二个参数是 app_name...auth,所以导致了新增肌 auth 迁移文件在 oauth 之后添加,这就会导致报错,解决方法是可以手动添加新增记录,然后修改记录 ID,自行调整排序。

    96820
    领券