Django:在不指定主键的情况下创建固定装置?

Posted

技术标签:

【中文标题】Django:在不指定主键的情况下创建固定装置?【英文标题】:Django: Create fixtures without specifying a primary key? 【发布时间】:2010-12-02 18:18:08 【问题描述】:

让我对 Django 固定装置感到困惑的一件事是,您必须指定每个模型的主键。有没有什么方法可以不用为每一行指定主键就可以创建fixture?

【问题讨论】:

你是用manage.py --dumpdata还是手写? 【参考方案1】:

使用“pk: null”而不是“pk: 1”(或其他),这将导致 PK 设置为 None,并且在保存对象时将分配一个主键。

这至少适用于 YAML,如果你是手动创建的,我猜你正在使用它。

【讨论】:

在使用 pk-less 夹具时必须小心。调用 loaddata 时,它会尝试添加新条目而不是覆盖现有条目。 spookylukey 或@Danosaure 有没有办法使用manage.py 转储数据生成“pk:null”固定装置?我正在合并两个具有相同架构的数据库,并正在研究如何使用 dumpdata/loaddata 来做到这一点 @BenRoberts pk:null 的问题是你可能会得到重复。我通常只是转储数据和 vi 文件来做这种事情。 如何使用此方法但与自然键一起使用?我想在加载数据时使用自然键作为对象ID。关于自然键的官方 Django 文档令人作呕:( @zen11625 - 如果 Django 中的文档不足,请提交错误 - code.djangoproject.com - 文档问题被视为错误。【参考方案2】:

如果你想在不使用 pk 的情况下添加关系,你应该看看 Natural Keys

https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-app-label-app-label-app-label-model

【讨论】:

不幸的是,关于自然键的文档没有提到上面使用的 pk=null 技巧。您需要 pk=null 和自然键才能拥有完全无 pk 的夹具。 不幸的是,该链接不再有效。这是今天有效的,让我们看看它是否持续超过 3 年:docs.djangoproject.com/en/dev/ref/django-admin/…【参考方案3】:

如果您查看 manage.py dumpdata 命令,您将看到一些名为 --natural-foreign、--natural-primary 的选项。如果您查看输出,您可以看到对象在没有使用主键或外键的情况下被转储。

【讨论】:

【参考方案4】:

我的一个朋友建议使用fixture 模块:http://farmdev.com/projects/fixture/

【讨论】:

这似乎是一堆可以使用的样板代码。我为测试生成数据的工作流程通常是使用管理界面创建数据,然后使用 django-test-utils 的 makefixture 将其转储到文件中,然后(如有必要)取消任何 pk 条目。【参考方案5】:

我不得不处理现有的数据库架构而无法更改它,因此我需要一个具有复杂主键或根本没有主键的表 - 但不需要使用串行表。我做了什么:

我已经为该字段指定了一个 primary_key=True,它根本不应该是唯一的,并且 写了重载方法:

class ContraIndicationsMedicines(models.Model):

    contra_indication = models.ForeignKey(ContraIndication, primary_key=True)
    medicine = models.ForeignKey(Medicine)

    def validate_unique(self, exclude=None): 
        pass

事实上,它满足了我的需要,但在 django.contib.admin 中有更多的验证调用。* 并不能保证所有的内联 e.t.c 都能正常工作。 那是我可以实施的唯一解决方案......((

【讨论】:

以上是关于Django:在不指定主键的情况下创建固定装置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有自动增量的情况下创建主键?

我可以在没有自动 ID 的情况下在 Django 中创建模型吗?

在不使用主键或辅助键的情况下使用 azure 存储帐户进行身份验证

清空桌子并装满固定装置

javascript 可以在不指定 PHP 等键的情况下将元素添加到数组吗?

Groovy - 如何在不更新地图的情况下使用默认值获取地图值