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

在django中,可以为某个超类定义一个外键,但在查询时返回该子类吗?

在Django中,可以为某个超类定义一个外键,但在查询时默认情况下是返回该超类的实例,而不是子类的实例。

Django中的外键是用来建立模型之间的关联关系的字段。当我们为某个超类定义一个外键时,该外键可以指向超类的实例,也可以指向子类的实例。但是在查询时,默认情况下,Django会返回该外键所指向的超类的实例。

如果我们希望在查询时返回子类的实例,可以使用Django的多态关系。多态关系允许我们在查询时返回子类的实例,而不仅仅是超类的实例。

在Django中,可以使用django-polymorphic库来实现多态关系。该库提供了一个PolymorphicModel基类,我们可以将超类继承自该基类,然后定义子类。在查询时,使用PolymorphicModel的objects属性进行查询,就可以返回子类的实例。

以下是一个示例:

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

class SuperClass(PolymorphicModel):
    # 超类的字段定义

class SubClass1(SuperClass):
    # 子类1的字段定义

class SubClass2(SuperClass):
    # 子类2的字段定义

# 在其他模型中定义外键
class OtherModel(models.Model):
    super_class = models.ForeignKey(SuperClass, on_delete=models.CASCADE)

# 查询时返回子类的实例
sub_class_instances = SuperClass.objects.instance_of(SubClass1)

在上述示例中,我们定义了一个超类SuperClass和两个子类SubClass1和SubClass2。在OtherModel模型中,我们定义了一个外键super_class,它指向SuperClass。在查询时,我们使用SuperClass.objects.instance_of(SubClass1)来返回SubClass1的实例。

推荐的腾讯云相关产品:腾讯云云服务器(https://cloud.tencent.com/product/cvm)和腾讯云数据库MySQL版(https://cloud.tencent.com/product/cdb_mysql)。

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

相关·内容

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

如果你的模型存在一个,并且through_fields没有指定,将会触发一个无效的错误。 对目标模型的有相同的限制(上面例子的 Person)。...Changed in Django 1.7: Django 1.6 及之前的版本,中介模型禁止包含多于一个。...取而代之的是,当它被用来作为一个其他model的基础,它将被加入那一子类。如果抽象化基础和它的子类有相同的项,那么将会出现error(并且Django返回一个exception)。...查询集始终返回请求的模型 也就是说,没有办法让DJango查询Person对象返回MyPerson对象。Person 对象的查询集会返回相同类型的对象。...但在普通的多表继承子类不能继承父的 manager ,这是因为处理非基字段,父的 manager 未必适用。 后一种情况 管理器文档有详细介绍。

5K20

python技术面试题(十九)--腾讯

定义模型,我们继承了 models.Model,这个模块 django.db。我们查询操作,需要导入模型,通过和对象完成数据增删改查。...__del__就是一个析构函数。 7.继承,执行析构函数,先执行父的,还是先执行子类的? 答:析构,会先调用子类的析构函数,再调用父的。...初始化子类,会先自动调用父的构造函数,然后调用子类的构造函数。 8.继承,所有的方法都会被继承? 答:不会,比如构造函数和析构函数,它们不能被继承。...python3range返回的是一个迭代对象,python2则是返回一个列表。这个题目我以为python3会报错,特意写出了上面的话。...InnoDB适合频繁修改以及安全性要求较高的应用, MyISAM适合查询为主的应用。我们的项目中使用的是 InnoDB。 15.如果将一个列表传入函数函数修改后,全局的列表会被修改

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

    model ,要显式地定义一个,它与包含多对多关系的 model 相关联。...如果你没有抽象基某个关联字段定义 related_name 属性,那么默认的反向名称就是子类名称加上 ‘_set’,它能否正常工作取决于你是否子类定义了同名字段。...查询集只返回请求所使用的 model (Querysets still return the model that was requested) 无论你何时查询 User 对象,Django 都不会返回...但在普通的多表继承子类不能继承父的 manager ,这是因为处理非基字段,父的 manager 未必适用。 manager documentation 有详细介绍。...如果某个特定名称 (例如,Meta) 出现在第一个当中,那么子类就会使用第一个特定名称。

    3.1K30

    Django之ORM字段和参数

    类型ORM中用来表示关联关系,一般把ForeignKey字段设置 '一对多''多'的一方。    ...(反向查询,我们会这么写: models.Classes.objects.first().student_set.all()   当我们ForeignKey字段添加了参数 related_name...,设置:models.SET(可执行对象) ---- db_constraint    是否在数据库创建约束,默认为True。...---- through      使用ManyToManyField字段Django将自动生成一张表来管理多对多的关联关系。...---- db_table                    默认创建第三张表,数据库中表的名称。 ---- 元信息 ORM对应的里面包含另一个Meta,而Meta封装了一些数据库的信息。

    2.3K60

    django模型动态修改参数,增加 filter 字段的方式

    其它属性详情请查看:官方文档 关系字段 ForeignKey 类型ORM中用来表示关联关系,一般把ForeignKey字段设置 ‘一对多’’多’的一方。...(反向查询,我们会这么写: models.Classes.objects.first().student_set.all() 当我们ForeignKey字段添加了参数 related_name...through:使用ManyToManyField字段Django将自动生成一张表来管理多对多的关联关系。...2元组('field1','field2'): # 其中field1是定义ManyToManyField的模型的名(author),field2是关联目标模型(book)的键名。...元信息 ORM对应的里面包含另一个Meta,而Meta封装了一些数据库的信息。

    3.8K31

    DjangoORM介绍和字段及其参数

    通常,一个模型(model)映射到一个数据库表, 基本情况: 每个模型都是一个Python,它是django.db.models.Model的子类。 模型的每个属性都代表一个数据库字段。...示例   app里面的models.py定义一个Person模型,包含 first_name 和 last_name。...关系字段 ForeignKey   类型ORM中用来表示关联关系,一般把ForeignKey字段设置 '一对多''多'的一方。   ...to="User", to_field="id", on_delete=models.SET(func) ) db_constraint:是否在数据库创建约束...verbose_name verbose_name的意思很简单,就是给你的模型一个更可读的名字: verbose_name = "pizza" 若未提供选项, Django 则会用一个名字的 munged

    2.8K80

    【Python全栈100天学习笔记】Day41 Django深入理解框架

    ,所以也能通过部门反向查询该部门的员工(从一对多关系“一”的一方查询“多”的一方),反向查询属性默认的名字是名小写_set(如上面例子的emp_set),当然也可以创建模型通过ForeingKey...定义__str__方法。 不要将数据文件放在同一个目录。...on_delete:关联的对象被删除对应的动作,可取的值包括django.db.models定义的: CASCADE:级联删除。...模型元数据选项 选项 说明 abstract 设置为True模型是抽象父 app_label 如果定义模型的应用不在INSTALLED_APPS可以用属性指定 db_table 模型使用的数据表名称...managed 设置为TrueDjango迁移创建数据表并在执行flush管理命令把表移除 order_with_respect_to 标记对象为排序的 ordering 对象的默认排序 permissions

    2.3K30

    Django ORM 多表操作

    ORM 多表操作 表模型 图书表 出版社表 作者表 作者详情表 表关系 一对一:一对一推荐建在查询频率高的一方 一对多:字段建在多的一方 多对多:字段建在查询频率多的一方,Django第三张表不需要创建...3、一般不需要设置联级更新. 4、一对多的多设置:models.ForeignKey("关联名", on_delete=models.CASCADE)。...6、若有模型存在外,创建数据,要先创建关联的模型的数据,不然创建包含的模型的数据的关联模型的数据会找不到 逆向到表模型 插入数据 ps:插入几条数据方便操作 ORM...设置属性的(多的表),MySQL 显示的字段名是:属性名_id。...正向:字段在哪,去从表的角度查另外的表,就是正向 反向:从没有表去查另外相关联的表,就是反向 口诀: 正向查询字段 反向查询按表名小写 注意: 正向:属性名 反向:小写名加 _set

    1.8K20

    流畅的 Python 第二版(GPT 重译)(七)

    这两种协议共享一个重要特征,即永远不需要声明支持某个协议,即通过继承来支持。 除了静态协议,Python 还提供了另一种代码定义显式接口的方式:抽象基(ABC)。...super()函数 对于维护的面向对象 Python 程序,一致使用super()内置函数至关重要。 当子类重写的方法,通常需要调用的相应方法。...__setitem__调用上的方法,让其插入或更新/值对。 调用self.move_to_end以确保更新的key位于最后位置。...无论是你还是编译器提供这些参数,super()调用都会返回一个动态代理对象,对象会在type参数的中找到一个方法(例如示例的__setitem__),并将其绑定到object_or_type,这样调用方法就不需要显式传递接收者...当实例化时,ListView 通过object_list实例属性具有一个迭代的对象,模板可以通过它来显示页面内容,通常是数据库查询返回多个对象的结果。

    18910

    Django分组聚合查询实例分享

    3.choice: 限制了选项字段值必须是指定的choice 一个 (元组套元组) sex = models.SmallIntegerField(choice=((1,’man’),(2,’...ForeignKey(): 字段 to= 关联模型 (一对多) to_file = 关联字段,省略默认关联主键 on_delete (关联数据被删除的操作) models.CASCADE...OneToOneField(): 一对一字段 同 3, ManyToManyField() :多对多关系 to = 关联模型 through=关联关系 through_fields关联关系表...(本身字段,关联字段) 断开外关联的ForeignKey使用(一对多,一对一) # 一对多查询 —-(publish and book) # 方式一 : 不使用book 添加 publish_id...) and author) # 断开后依然支持Django ORMlianiao 查询语法 # 当新表无需新加额外字段, 可以自动创建 class MyBook(models.Model):

    1.8K10

    Django-Multitenant,分布式多租户数据库项目实战(PythonDjango+Postgres+Citus)

    目录 项目源码 安装 支持的 Django 版本/前提条件。 用法 模型变化 使用 mixins 更改模型 db 层自动化复合: 在哪里设置租户?...: 使用 mixins 更改模型 您要使用库的任何文件,只需: 所有模型都应使用 TenantModelMixin 和 django models.Model 或您的客户模型 Ex: class...: db 层自动化复合: 使用 TenantForeignKey 租户相关模型之间创建将自动将 tenant_id 添加到引用查询(例如 product.purchases)和连接查询(例如...如果要确保 db 层创建复合(带有 tenant_id),则应将 settings.py 的数据库 ENGINE 更改为 django_multitenant.backends.postgresql...只需在身份验证设置它,库将确保其余部分(将 tenant_id 过滤器添加到查询)。上面的示例实现如下: 您的设置,您需要更新 MIDDLEWARE 设置以包含您创建的设置。

    1.9K10

    后端框架学习-Django

    查询谓词 类属性 + ‘__’ + 谓词 定义:做更灵活的条件查询需要使用查询谓词 说明:每一个查询谓词都是一个独立的查询功能 __exact:等值匹配 Author.objects.filter...创建一对一数据 无的模型,和之前相同 有的模型: wife = Wife.objects.create(name=’王夫人’,author = author1(类属性名称绑实例...)) wife = Wife.objects.create(name=’王夫人’,author_id = 1(类属性字段绑值)) 一对一查询 正向查询:从查对象 反向查询:从对象查 调用反向属性查询到关联的一方...一对多查询 核心:正向属性(authors)和反向属性(book_set) 多表上设置,关联一表。...无的模型,和之前相同 有的模型: 类似上面 wife = Wife.objects.create(name=’王夫人’,author = author1(类属性名称绑实例)

    9.5K40

    Django 模型继承 BaseModel

    Meta 继承 当一个抽象基被建立,Django 将所有你申明的 Meta 内部类以属性的形式提供。若子类定义自己的 Meta ,它会继承父的 Meta。... 或 多对多字段 使用了 related_name 或 related_query_name,你必须为字段提供一个 独一无二 的反向名字和查询名字。...这名字看起来就像你子类定义的一样。...QuerySet 仍会返回请求的模型¶ 当你用 Person 对象查询Django 永远不会返回 MyPerson 对象。Person 对象的查询结果集总是返回对应类型。...注解 某些字段模型内定义了额外的属性,例如 ForeignKey 定义一个额外的属性 _id 附加在字段名上,类似的还有上的 related_name 和 related_query_name。

    2.1K10

    django 1.8 官方文档翻译: 2-5-6 多数据库

    设置映射数据库别名到一个数据库连接设置的字典,这是整个Django 引用一个数据库的方式。字典的设置 DATABASES 文档中有完整描述。 你可以为数据库选择任何别名。...当设置了model_name,hints 通常通过’model‘包含模型的。注意,它可能是一个历史模型,因此不会有自定的属性、方法或管理器。你应该只依赖_meta。...这个方法还可以用来决定一个给定数据库上某个模型的可用性。 注意,如果这个方法返回False,迁移将默默地不会在模型上做任何操作。这可能导致你应用某些操作之后出现损坏的、表多余或者缺失。...当保存在statement 2发生,p已经具有一个主键,Django 将尝试新的数据库上使用主键。...如果你使用一个路由来路由分离到不同的数据库上,这些模型定义的任何和多对多关联必须在单个数据库的内部。 这是因为引用完整性的原因。

    1.5K20

    DjangoORM操作

    1、无需连表查询性能低,省硬盘空间(选项不固定时用) 2、modle文件里不能动态增加(选项一成不变用Django的choice) 其他字段 db_index = True 表示设置索引 unique...SQL操作 # query_set缓存机制1次数据库查询结果query_set都会对应一块缓存,再次使用query_set,不会发生新的SQL操作; #这样减小了频繁操作数据库给数据库带来的压力...:obj=(属性=X,=obj)obj.save() classify_obj=models.Classify.objects.get(category='武侠') publish_obj...正向查找:ForeignKey UserInfo表,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。...字段就建在子表; 如果B表的1条记录也对应A表N条记录,两表之间就是双向1对多关系,也称为多对多关系; orm设置如果 A表设置了字段user=models.ForeignKey('UserType

    4.8K10

    37.Django1.11.6文档

    你编写完基之后, Meta设置 abstract=True , 这个模型就不会被用来创建任何数据表。 取而代之的是,当它被用来作为一个其他model的基,它的字段将被加入那些子类。...4.Meta继承 当一个抽象基被创建的时候, Django把你内部定义的 Meta 作为一个属性使其可用。 如果子类没有声明自己的Meta, 它将会继承父的Meta。...')) select_related() select_related(*fields) 返回一个QuerySet,当执行它的查询它沿着关系查询关联的对象的数据...它会生成一个复杂的查询并引起性能的损耗,但是以后使用关系将不需要数据库查询。...此方法将返回当前活动的用户模型 — 如果指定了自定义用户模型,否则返回User。 定义到用户模型的或多对多关系,应使用AUTH_USER_MODEL设置指定自定义模型。

    24.3K80

    django 1.8 官方文档翻译: 3-4-2 内建显示视图

    如果你将你的视图实现为通用视图的子类,你就会发现这样能够更有效地编写你想要的代码,使用你自己的基于或功能的视图。 一些三方的应用,有更多通用视图的示例,或者你可以自己按需编写。...,合并到所有的上下文数据。...要在你自己想要改变上下文的中保持这一行为,你应该确保调用了get_context_data。如果没有任意两个尝试定义相同的,会返回异常的结果。...然而,如果任何一个尝试持有一个的情况下覆写它(调用之后),这个的任何子类都需要显式于之后设置它,如果你想要确保他们覆写了所有的话。...然而,通过使用queryset来定义一个过滤的对象列表,你可以更加详细 的了解哪些对象将会被显示的视图中(参见执行查询来获取更多关于查询集对象的更对信息,以及参见 基于的视图参考来获取全部 细节)。

    1.4K40
    领券