
Django Fixtures 提供了一种便捷的方式将示例数据加载到数据库中。然而,如果外键 ID 采用硬编码方式,当 ID 发生变化或数据在数据库间迁移时,Fixture 可能会失效。
更好的方案是使用自然键,它允许您通过有意义的值(而非数字 ID)来引用外键。
在 Fixture 中硬编码主键可能导致以下问题:
自然键通过让 Django 动态查找关联关系来解决这些问题。
要使用自然键,您需要:
natural_key() 方法。在 models.py 中,为外键引用的模型添加 natural_key() 方法。
<code class="python">from django.db import models
class CategoryManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Category(models.Model):
name = models.CharField(max_length=255, unique=True)
objects = CategoryManager()
def natural_key(self):
return (self.name,)</code>这允许您通过名称(而非 Fixture 中的 ID)来引用类别。
使用自然键而非数字 ID 来引用外键。
<code class="json">[
{
"model": "shop.category",
"pk": 1,
"fields": {
"name": "electronics"
}
},
{
"model": "shop.product",
"fields": {
"name": "smartphone",
"category": 1
}
}
]</code><code class="json">[
{
"model": "shop.category",
"fields": {
"name": "electronics"
}
},
{
"model": "shop.product",
"fields": {
"name": "smartphone",
"category": ["electronics"]
}
}
]</code>Django 将自动根据名称查找类别,而无需使用 ID。
Fixture 准备就绪后,加载它:
<code class="bash">python manage.py loaddata your_fixture.json</code>
Django 将使用 get_by_natural_key() 来匹配外键。
不是。即使定义了 natural_key(),Django 也允许您使用:
您可以根据需要混合使用两者。
何时应该使用自然键?
在以下情况下使用自然键:
在以下情况下继续使用数字 ID:
在 Django Fixture 中使用自然键可以使您的数据更灵活、更易于管理。Django 将动态查找关联关系,而非依赖可能发生变化的 ID,从而使您的 Fixture 更可靠。
建议在 Django 项目中使用自然键来简化 Fixture 并避免不必要的麻烦。
以上就是在没有硬编码 ID 的情况下使用带有外键的 Django Fixture的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号