我对Django的fixture之一的烦恼是必须指定每个模型的主键。是否有办法创建fixture而无需为每行指定主键?
使用 "pk: null" 代替 "pk: 1"(或其他任何值),这将导致 PK 设置为 None,在保存对象时会分配一个主键。
至少对于 YAML,这是有效的,如果你手动创建,我猜你在使用它。
fixture
模块: http://farmdev.com/projects/fixture/。manage.py dumpdata
命令,您会看到一些选项,如--natural-foreign
,--natural-primary
等。如果您查看输出,您会发现对象被转储而不使用主键或外键。我不得不处理现有的数据库模式,而没有改变它的可能性,因此我需要一个具有复杂主键或根本没有主键的表 - 但不是序列号。我的做法是:
我对字段指定了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.* 中有更多的验证调用,而并非所有的内联等都能够保证正常工作。 那是我能够实现的唯一解决方案...((
使用自然主键(其中模型字段选项设置为“primary_key=True
”),您可以轻松地在夹具中省略主键的规范。 Django将自动检查自然主键,因此不会添加重复条目。
当存在自动主键时,我唯一看到的选择是转储数据并使用脚本编辑条目或将新条目的主键设置为空,如@spookylukey所述。