Django 固定装置简化了示例数据的加载,但硬编码外键 ID 会造成脆弱性。 当 ID 更改或数据在数据库之间移动时,此方法就会失效。 解决方案是什么? 自然键。 它们允许您使用有意义的值而不是数字 ID 来引用外键。
装置中的硬编码主键会导致几个问题:
自然键通过允许 Django 动态解析关系来消除这些问题。
使用自然键涉及以下步骤:
natural_key()
方法: 在相关模型中,添加 natural_key()
方法。在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 来引用。
使用自然键来引用外键,而不是数字 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
查找类别。
使用以下方式加载夹具:
<code class="language-bash">python manage.py loaddata your_fixture.json</code>
Django 使用 get_by_natural_key()
来匹配外键。
不。 即使定义了 natural_key()
,您仍然可以使用:
根据需要组合它们。
何时使用自然键?
在以下情况下使用自然键:
在以下情况下使用数字 ID:
结论
Django 装置中的自然键增强了数据灵活性和可管理性。 Django 不依赖可能变化的 ID,而是动态解析关系,从而产生更强大的固定装置。 将自然键合并到您的 Django 项目中,以简化设备管理并减少问题。
以上是在没有硬编码 ID 的情况下使用带有外键的 Django Fixture的详细内容。更多信息请关注PHP中文网其他相关文章!