Django:如何在不指定主键的情况下创建固定数据?

68

我对Django的fixture之一的烦恼是必须指定每个模型的主键。是否有办法创建fixture而无需为每行指定主键?


1
你是使用 manage.py --dumpdata 还是手写数据? - Thomas Schreiber
6个回答

99

使用 "pk: null" 代替 "pk: 1"(或其他任何值),这将导致 PK 设置为 None,在保存对象时会分配一个主键。

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


32
使用无 pk 的 Fixture 时需要小心。当调用 loaddata 时,它会尝试添加新条目而不是覆盖现有的条目。 - Danosaure
1
spookylukey或@Danosaure,有没有办法使用manage.py dumpdata生成“pk:null”固定装置?我正在合并具有相同模式的两个数据库,并正在研究如何使用dumpdata / loaddata完成此操作 - B Robster
1
@BenRoberts pk:null 的问题是你可能会得到重复的内容。我通常会使用 dumpdata 命令将数据导出,然后使用 vi 编辑文件来处理这种情况。 - Danosaure
谢谢@Danosaure。我最终写了一个快速的python脚本,使用正则表达式来完成这个技巧。 - B Robster
1
如何同时使用自然键来使用此方法?我想在loaddata时将自然键用作对象ID。官方Django文档关于自然键的描述令人不满 :( - Vladimir Chub
1
@zen11625 - 如果在Django中文档不足,请提交一个bug - https://code.djangoproject.com/ - 文档问题被视为bug。 - spookylukey

13

8
很遗憾,有关自然主键的文档未提及上文中使用的 pk=null 技巧。您需要同时使用 pk=null 和自然主键才能拥有完全没有主键的 fixture。 - Cerin
很遗憾,该链接已经失效。这是一个今天有效的链接,让我们看看它是否能持续超过3年:https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-app-label-app-label-app-label-model - Jay Taylor

0

1
这似乎是一大堆需要处理的样板代码。我生成测试数据的工作流程通常是使用管理员界面创建数据,然后使用django-test-utils的makefixture将其导出到文件中,并在必要时将任何pk条目置空。 - Matthew Schinckel

0
如果您查看manage.py dumpdata命令,您会看到一些选项,如--natural-foreign--natural-primary等。如果您查看输出,您会发现对象被转储而不使用主键或外键。

-1

我不得不处理现有的数据库模式,而没有改变它的可能性,因此我需要一个具有复杂主键或根本没有主键的表 - 但不是序列号。我的做法是:

我对字段指定了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.* 中有更多的验证调用,而并非所有的内联等都能够保证正常工作。 那是我能够实现的唯一解决方案...((


-1

自然主键

使用自然主键(其中模型字段选项设置为“primary_key=True”),您可以轻松地在夹具中省略主键的规范。 Django将自动检查自然主键,因此不会添加重复条目。

自动主键(非手动定义的pk)

当存在自动主键时,我唯一看到的选择是转储数据并使用脚本编辑条目或将新条目的主键设置为空,如@spookylukey所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接