- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当启用自然键时,如何从 Django 的转储数据生成的 JSON 中排除主键?
我构建了一个我想“导出”的记录,以便其他人可以将其用作模板,方法是将其加载到具有相同模式的单独数据库中,而不会与同一模型中的其他记录发生冲突。
据我了解 Django 对自然键的支持,这似乎是 NK 的设计目的。我的记录有一个唯一的 name
字段,它也被用作自然键。
所以当我运行时:
from django.core import serializers
from myapp.models import MyModel
obj = MyModel.objects.get(id=123)
serializers.serialize('json', [obj], indent=4, use_natural_keys=True)
我期望这样的输出:
[
{
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
然后我可以使用 loaddata 将其加载到另一个数据库中,期望它被动态分配一个新的主键。请注意,我的“create_user”字段是 Django 的 auth.User 模型的 FK,它支持自然键,并且输出为自然键而不是整数主键。
然而,生成的实际上是:
[
{
"pk": 123,
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
这显然会与主键为 123 的任何现有记录发生冲突并覆盖该记录。
解决此问题的最佳方法是什么?我不想将所有自动生成的主键整数字段追溯更改为任何等效的自然键,因为这会导致性能下降以及劳动密集型。
最佳答案
为 2018 年及以后遇到此问题的任何人更新答案。
有一种方法可以通过使用自然键和 unique_together 方法来省略主键。取自Django documentation on serialization :
你可以使用这个命令来测试:
python manage.py dumpdata app.model --pks 1,2,3 --indent 4 --natural-primary --natural-foreign > dumpdata.json ;
自然键序列化
那么如何让 Django 在序列化对象时发出一个自然键呢?首先,您需要添加另一个方法——这次添加到模型本身:
class Person(models.Model):
objects = PersonManager()
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
def natural_key(self):
return (self.first_name, self.last_name)
class Meta:
unique_together = (('first_name', 'last_name'),)
该方法应该总是返回一个自然键元组——在这个例子中,(名字,姓氏)。然后,当您调用 serializers.serialize()
时,您提供 use_natural_foreign_keys=True
或 use_natural_primary_keys=True
参数:
serializers.serialize('json', [book1, book2], indent=2, use_natural_foreign_keys=True, use_natural_primary_keys=True)
当指定 use_natural_foreign_keys=True
时,Django 将使用 natural_key()
方法将任何外键引用序列化为定义该方法的类型的对象。
当指定 use_natural_primary_keys=True
时,Django 将不会在该对象的序列化数据中提供主键,因为它可以在反序列化期间计算:
{
"model": "store.person",
"fields": {
"first_name": "Douglas",
"last_name": "Adams",
"birth_date": "1952-03-11",
}
}
关于python - 使用自然键排除 Django 转储数据中的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436954/
我有一套使用两种语言的文档:英语和德语。关于这些文档没有可用的元信息,程序只能查看其内容。基于此,程序必须决定用哪种语言编写文档。 是否有可以在几个小时内实现的针对该问题的“标准”算法?或者,一个免费
背景 我有一个日志系统,可以将记录输出到 std::ostream .每条记录都用一个计数器进行注释,该计数器随着每个输出而增加 1,如下所示: ===== Batch # 5 ===== T
用户可能希望根据需要分隔数字。 从字符串中提取所有(自然)数字的最有效(或简单的标准函数)是什么? 最佳答案 您可以使用正则表达式。我从 Sun's regex matcher tutorial 修改
我认为如果表有代理键而没有(自然)替代键是没有意义的(请记住,代理键的属性之一是它在数据库之外没有意义环境)。 例如假设我有下表: 假设 employee_id 是代理主键,表中没有(自然)备用键。
我想将屏幕方向锁定为其默认方向。我在实现这一点时遇到问题。最初我将屏幕锁定为 list 中的肖像。它适用于纵向默认设备。但是许多平板电脑默认为横向,因此在这些设备中锁定纵向是不合适的,我想检测此默认方
我已将笔记本电脑上的触摸板滚动设置为倒置(自然)。它适用于任何地方(pdf、浏览器等),但在 vscode 中,它坚持正常滚动。通过 vscode 的设置文件没有显示适当的条目。 系统:Ubuntu
在我发现的许多在上限集合上使用可尾游标的示例中,代码包括: hint( { $natural: 1 } ) (例如 here ),包括官方文档 ( here ),以“确保我们不使用任何索引”,并且结果
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: T
一些上下文:Node.js、Bot、natural module . 我想构建一个机器人,并且我正在使用自然模块来解析用户输入并对其进行总体分类。 var classifier = new natur
我是一名优秀的程序员,十分优秀!