首页 >后端开发 >Python教程 >在没有硬编码 ID 的情况下使用带有外键的 Django Fixture

在没有硬编码 ID 的情况下使用带有外键的 Django Fixture

DDD
DDD原创
2025-01-17 08:11:38342浏览

Using Django Fixtures with Foreign Keys Without Hardcoded IDs

Django 固定装置简化了示例数据的加载,但硬编码外键 ID 会造成脆弱性。 当 ID 更改或数据在数据库之间移动时,此方法就会失效。 解决方案是什么? 自然键。 它们允许您使用有意义的值而不是数字 ID 来引用外键。


为什么要避免在装置中使用硬编码的外键 ID?

装置中的硬编码主键会导致几个问题:

  • 不同环境下的数据库不一致。
  • 由于 ID 更改而导致的修复失败。
  • 管理关系方面的手动工作量增加。

自然键通过允许 Django 动态解析关系来消除这些问题。


在 Django 中实现自然键

使用自然键涉及以下步骤:

  1. 定义 natural_key() 方法: 在相关模型中,添加 natural_key() 方法。
  2. 创建自定义管理器:此管理器将使用自然键获取对象。
  3. 在装置中使用自然键:用自然键替换数字 ID。

第 1 步:在相关模型中定义自然键

models.py中,向外键引用的模型添加natural_key()方法:

<code class="language-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>

这允许通过 name 引用类别,而不是在灯具中通过 ID 来引用。


第 2 步:使用自然键创建灯具

使用自然键来引用外键,而不是数字 ID。

夹具示例(数字 ID – 过时的方法)

<code class="language-json">[
    {
        "model": "shop.category",
        "pk": 1,
        "fields": {
            "name": "Electronics"
        }
    },
    {
        "model": "shop.product",
        "fields": {
            "name": "Smartphone",
            "category": 1
        }
    }
]</code>

夹具示例(自然键 - 改进方法)

<code class="language-json">[
    {
        "model": "shop.category",
        "fields": {
            "name": "Electronics"
        }
    },
    {
        "model": "shop.product",
        "fields": {
            "name": "Smartphone",
            "category": ["Electronics"]
        }
    }
]</code>

Django 自动通过 name 查找类别。


第 3 步:加载灯具

使用以下方式加载夹具:

<code class="language-bash">python manage.py loaddata your_fixture.json</code>

Django 使用 get_by_natural_key() 来匹配外键。


自然键总是必要的吗?

不。 即使定义了 natural_key(),您仍然可以使用:

  • 数字 ID(传统方法)。
  • 自然键(适应性更强)。

根据需要组合它们。


何时使用自然键?

在以下情况下使用自然键:

  • 需要跨数据库设备兼容性。
  • 您的模型中存在一个独特的字段(例如,用户名、slug、名称)。
  • 应避免手动 ID 跟踪。

在以下情况下使用数字 ID:

  • 模型中不存在唯一的自然标识符。
  • 使用小型、不变的数据集。

结论

Django 装置中的自然键增强了数据灵活性和可管理性。 Django 不依赖可能变化的 ID,而是动态解析关系,从而产生更强大的固定装置。 将自然键合并到您的 Django 项目中,以简化设备管理并减少问题。

以上是在没有硬编码 ID 的情况下使用带有外键的 Django Fixture的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn