问题标签 [django-polymorphic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
404 浏览

django - Django ORM 将相关对象与 prefetch_related 混淆

我遇到了非常奇怪的prefetch_related呼叫行为。这是插图:

为了清楚Primary起见,我的系统中没有没有相关Secondary对象的对象,但上面的代码仍然针对其中一些(总是相同的)命中了重新查询部分,并且重新查询获取了那些是失踪。更奇怪的是,我可以看到一些主节点在它们的辅助节点中出现重复secondaries.all()——总体印象是 ORM 错误地将一些辅助节点集合连接到错误的主节点。

有什么问题?这是 Django 或数据库的一些错误吗?

我使用 Django 1.10.5、psycopg2 2.7.3 和 Postgres 9.6。

更新:我发现问题更严重:有时 ORM 会返回不完整的相关对象列表,所以我上面解释的解决方法没有帮助。我们不得不删除 prefetch_related 调用,因为显然我们不能依赖它返回的数据。

更新 2:正如 Daniel 在评论中所问的,这里有一些真实的 SQL 查询(尽管不是来自我们遇到问题的系统)。backend_build是“主要”模型,并且有几个“次要”模型:backend_buildproblembackend_sanityproblembackend_runproblem— 我们使用 django_polymorphic 来表示它们,基本模型是backend_problem.

Python 代码如下所示:

以下是生成的 SQL 查询:

像这样的查询还有很多,这里就省略了。从上面看起来很清楚,系统 ritst 查询主模型,然后请求每个主对象的关系,并考虑它们的多态类型。

0 投票
1 回答
106 浏览

python - 在通用视图中将 PolymorphicModel 分类对象控制为模型

我有一个名为 Vehicle 的 PolymorphicModel 类,我从中派生了两个类:Car 和 Truck。

我使用 UpdateView 进行更新,但它随机从 vehicle_list 获取 vehicle_id。而且我必须控制该型号是哪种类型的车辆。但我做不到。

我的课程:

鉴于:

但它给出了这个错误:

顺便说一句,我尝试使用“isinstance()”,但它没有用。也许是关于成为 PolymorphicModel,我不知道。

0 投票
2 回答
962 浏览

python - 使用 ABC、PolymorphicModel、django-models 会产生元类冲突

到目前为止,关于 SO 的所有其他答案都以完全相同的方式回答:构建您的元类,然后继承这些元类的“加入”版本,即

但我不知道这些人生活在什么世界,他们在哪里构建你自己的元类!显然,一个人会使用来自其他库的类,除非你对元编程有一个完美的处理,否则你怎么知道你是否可以覆盖一个类的元类?(显然我还没有掌握它们)。

我的问题是:

这当然给了我错误:“元类冲突:派生类的元类必须是其所有基础元类的(非严格)子类” 我已经尝试了上面给出的解决方案的许多变体,以下是不工作,给出同样的错误。

也没有在类 Meta 函数中放置任何东西。我已经阅读了有关此主题的所有其他 SO 问题,请不要简单地将其标记为重复。

-------------------在接受解决方案后于 2018 年 1 月 8 日编辑-------

奇怪的是,如果我尝试使用这个新配置(我接受的那个)进行迁移,它会再次开始给出元类错误,但它在运行时仍然有效。如果我注释掉元类部分然后 makemigrations 并迁移,它会成功完成,但是每次迁移后我都必须将它放回那里。

0 投票
1 回答
924 浏览

python - Django Rest Framework:派生模型序列化器字段

我正在使用 Django Rest Framework 和 django-polymorphic-tree 构建一个树状分层数据库系统。我有两个模型——BaseTreeNode 和 DescriptionNode(后一个是从 BaseTreeNode 派生的)。具体来说,这是我的models.py

因此,每个title字段(属于BaseTreeNode)都有一个关联description字段(属于 DescriptionNode)。

Django 管理视图

现在,我想要的只是一个返回整个树的嵌套表示的 JSON。目前,我只定义了一个带有递归字段的简单序列化程序。我的序列化程序.py

这给了我(仅适用于 BaseTreeNodeSerializer):

我的问题是,如何在层次结构description中包含与每个title字段(来自 BaseTreeNode 模型)相关联的字段(来自派生模型)?就像是:

0 投票
1 回答
340 浏览

django - 如何复制 Django 多态对象?

使用该django-polymorpic模块是一种简化对象继承的好方法,其中许多子类都继承自基类,并与基类共享多个属性。但是,虽然几乎所有东西都像普通对象一样工作,但清除.pk和调用的方法save()不起作用?我试过了:

并且还尝试过:

有人有答案吗?

0 投票
0 回答
234 浏览

django - Django-多态预保存信号

我正在尝试在我的电子商务项目中切换到 django 多态模型,但发现预保存信号存在问题。

通过管理员创建新产品时,我需要用唯一值填充对象的“Slug”字段。在非多态版本中,它是通过来自父“产品”模型的所有子类的预保存信号实现的:

现在模型层次结构看起来如下(简化):

接收者:

创建多态子模型实例时的发送者类是什么?还是在 django-polymorphic 中触发了任何 pre_save 信号?

即使在没有定义发送者类的情况下使用 pre_save.connect 时,我也没有收到任何信号。

谢谢!

0 投票
1 回答
300 浏览

django - How to find serializer for a django model?

I am working on a project in which I am using django-polymorphic for retrieving polymorphic result sets. I have some models which inherit from a parent model. For example, Model B inherits from Model A and Model C also inherits from Model A. Model B and Model C have their own serializers and when I query all records for model A, I get a mixed resultset containing instance of Model B and C.

How can I dynamically select serializer based on the instance?

Thanks

0 投票
0 回答
1068 浏览

django - 如何在 Django 模型中使用抽象父类进行过滤或查询?

这个解决起来很有趣。我正在构建一个模块来注册医院、医疗商店和医生的地址。有一个抽象模型 PrimaryAddress 和一个名为 MedicalStorePrimaryAddress 的子类,更多的子类将使用相同的抽象模型。我正在使用 django rest 框架来获取基于邻近度(纬度、经度和城市)的列表。现在我如何使用父类过滤它,即 PrimaryAddress 模型,因为我想过滤所有实体,即附近的医院、医疗商店和医生。我研究了 django-polymorphic 库,但它对 geodjango 和抽象类没有帮助。任何帮助建议表示赞赏。谢谢 这是代码示例:

0 投票
1 回答
162 浏览

django - 无法在 Django Rest 框架 JSON API 示例项目中创建多态项目实例

我试图了解多态资源如何在 django-rest-framework-json-api 中工作,并且在我自己的项目和 django-rest-framework-json-api 提供的示例项目中都出现以下错误。我的模型是使用 django-polymorphic 创建的。我试图运行的示例项目是https://github.com/django-json-api/django-rest-framework-json-api/tree/master/example

端点:localhost:8000/projects

用于创建新实例的项目页面的表单没有任何我可以指定项目类型的字段。它只显示主题字段。所以我也想知道如何创建一个艺术项目。

在文档中,它说类型由resource_name视图、序列化器或模型的元数据确定。但是返回的 json 数据中的 type 是 none。这是因为serializer.instance = Nonewhich 用于确定类型 whenforce_type_resolution设置为True。它设置为True强制多态序列化程序根据实例解析类型。

所以我似乎无法解决这个问题,也许我缺少一些配置或者代码中确实存在错误,但我不知道。如果您遇到此问题或知道如何让示例应用程序使用多态资源,有人可以告诉我如何解决这个问题吗?

0 投票
1 回答
95 浏览

python - 带有额外字段的 DRF 多态多对多

我正在修补 Django Rest Framework 以构建一个可以处理电子元件物料清单 (BoM) 的 api。

我正在使用 django-polymorphic 和 django-rest-polymorphic 所以我可以为组件使用多态模型(它们具有共享属性,但我仍然想以几乎相同的方式处理它们。多态模型非常适合此目的) .

一切都很好,直到我介绍了带有“通过”属性的多对多关系。我想要的是一个有几个不同组件的 BoM,每个组件都有一个数量,例如 BoM1 有 2x470k 电阻器和 3x 100uF 电容器。

models.py:(为了防止这篇文章成为史诗小说而进行了一些修剪)

序列化程序.py:

使用此代码,我可以毫无问题地创建 EletronicComponentQty 对象。但是,当我尝试列出 BoM(通过序列化程序)时,我得到: AttributeError at /pedalparts/boms/ Got AttributeError when trying to get a value for field bomon serializer ElectronicComponentQtySerializer。序列化器字段可能命名不正确,并且与Capacitor实例上的任何属性或键都不匹配。原始异常文本是:“电容器”对象没有属性“bom”。

任何人都知道我该如何解决这个问题?我愿意接受任何使这项工作发生的变化。