- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下内容:
target_content_type = models.ForeignKey(ContentType, related_name='target_content_type')
target_object_id = models.PositiveIntegerField()
target = generic.GenericForeignKey('target_content_type', 'target_object_id')
我希望 dumpdata --natural 发出此关系的自然键。这可能吗?如果没有,是否有替代策略不会将我与目标的主键联系起来?
最佳答案
TL;DR - 目前没有明智的方法可以做到这一点,除了创建自定义Serializer
/Deserializer
对。
具有通用关系的模型的问题是 Django 根本不将 target
视为字段,只有 target_content_type
和 target_object_id
,并尝试单独序列化和反序列化它们。
负责序列化和反序列化 Django 模型的类位于模块 django.core.serializers.base
中和 django.core.serializers.python
。所有其他(xml
、json
和 yaml
)都扩展了其中一个(并且 python
扩展了 base
)。字段序列化是这样完成的(省略无关行):
for obj in queryset:
for field in concrete_model._meta.local_fields:
if field.rel is None:
self.handle_field(obj, field)
else:
self.handle_fk_field(obj, field)
这是第一个复杂情况:ContentType
的外键处理正常,使用我们期望的自然键。但是 PositiveIntegerField
由 handle_field
处理,其实现如下:
def handle_field(self, obj, field):
value = field._get_val_from_obj(obj)
# Protected types (i.e., primitives like None, numbers, dates,
# and Decimals) are passed through as is. All other values are
# converted to string first.
if is_protected_type(value):
self._current[field.name] = value
else:
self._current[field.name] = field.value_to_string(obj)
即此处自定义的唯一可能性(子类化 PositiveIntegerField
并定义 custom value_to_string
)将不起作用,因为序列化程序不会调用它。将 target_object_id
的数据类型更改为整数以外的其他类型可能会破坏许多其他内容,因此这不是一个选项。
在这种情况下,我们可以定义自定义handle_field
来发出自然键,但接下来会出现第二个复杂情况:反序列化是这样完成的:
for (field_name, field_value) in six.iteritems(d["fields"]):
field = Model._meta.get_field(field_name)
...
data[field.name] = field.to_python(field_value)
即使我们自定义了 to_python
方法,它也会单独作用于 field_value
,脱离对象的上下文。使用整数时这不是问题,因为它会被解释为模型的主键无论是什么模型。但要反序列化自然键,首先我们需要知道该键属于哪个模型,并且除非我们获得对该对象的引用(并且 target_content_type
字段已经被反序列化),否则该信息不可用)。
正如您所看到的,这并不是一项不可能的任务 - 支持通用关系中的自然键 - 但要实现这一目标,需要在序列化和反序列化代码中更改很多内容。那么必要的步骤(如果有人觉得能够胜任这项任务)是:
PositiveIntegerField
的自定义 Field
,并使用对对象进行编码/解码的方法 - 调用引用模型的 natural_key
和 get_by_natural_key
;handle_field
以调用编码器(如果存在);field_value
,还传递对已解码 ContentType
的引用。关于django - 是否可以在 Django 中使用自然键作为 GenericForeignKey ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159377/
我根据文档编写了此类,以便能够对应用程序中具有 id 的任何内容进行投票: class Vote(models.Model): class Meta: unique_toget
我正在尝试在 Django 中将 ForeignKey 转换为 GenericForeignKey。我计划在三个迁移中执行此操作,mig1、mig2、mig3。 迁移1(mig1)有以下代码 clas
我正尝试在 this tutorial 之后实现事件提要. 当相应的对象(即评论本身)已被删除时,我想删除一个事件(即已添加评论)。这似乎没有级联。 有没有办法在不添加 GenericRelation
我正在创建一个 Django 应用程序,其中所有模型都可以按照用户设置的顺序相互关联。我正在使用 GenericForeignKeys 设置所有这些。关键是我需要能够支持这些类型的关系/管理的多个集合
class MyUser(AbstractBaseUser): ... content_type = models.ForeignKey(ContentType, limit_choi
假设我有一个模型 Box与 GenericForeignKey指向 Apple实例或 Chocolate实例。 Apple和 Chocolate ,反过来,拥有 Farm 的 ForeignKeys和
我正在创建一个自定义评论系统,它可以使用 contenttypes GenericForeignKey 将评论附加到任何模型。 class Comment(models.Model): bod
我更改了 GenericForeignKey() 可以引用的某些对象的默认管理器,以便这些对象可能不再出现在该默认管理器中。 我有其他管理器能够找到这些已删除对象,但我看不出有什么办法可以告诉内容类型
好的,所以我的数据库有一个标题/行类型结构,其中有标题模型,其中有许多行模型。许多型号都采用这种结构。我想跟踪哪些 header 模型与哪些行模型相关。 最初,我只是在 header 模型上有一个指向
重要提示:此问题不再相关。 在 Django 1.7 迁移中,我尝试使用以下代码以编程方式创建评论条目: # -*- coding: utf-8 -*- from __future__ import
我想在 Django Rest Framework 中显示相关 GenericForeignKey 的嵌套表示。这是我尝试过的: class ContentRelatedField(serialize
我是 GenericForeignKey 的新手,我无法让它在查询语句中工作。表格大致如下: class Ticket(models.Model): issue_ct = models.For
我如何根据用户的 content_type 选择创建/处理动态表单? 我正在编写一个 View /模板来添加一个对象,该模型持有其他模型的通用键: class MainModel(models.Mo
我有一个模型,它使用通用外键使用“content_type”字段来存储内容类型和“object_id”来存储对象 ID。该模型需要使用 CRUD API 进行操作,而我正在使用 DRF。我有一个模型的
我正在 Django 中开发一个讨论应用程序,它包含主题、帖子、回复和投票。投票使用 Generic Foreign Keys and Content Types以确保用户只能对特定主题/帖子/回复投
下面的模型显示了一个简单的 GenericForeignKey 关系。它以这种方式设置,以允许任何其他模型重用图像。 class Image(models.Model): name = mod
我有一个事件应用程序来记录用户或任何事件操作。因此,为了实现这一点,我必须在我的模型上使用 GenericForeignKeys,因为许多模型可以执行操作。 这是我的模型: class Activit
我有以下内容: target_content_type = models.ForeignKey(ContentType, related_name='target_content_type') tar
我使用了一个投票应用程序(django-ratings,如果这有什么不同的话),它使用 django 的 GenericForeignKey,有一个用户的 ForeignKey,以及几个其他字段,比如
有没有一种方法可以让 GenericForeignKey 具有与foreignkey连接的两个模型上的字段? from django.db import models from django.cont
我是一名优秀的程序员,十分优秀!