我使用 Django 的 dumpdata 来保存数据并使用 loaddata 来重新加载它。我也在使用自然键。我的模型看起来与此类似:
class LinkManager(models.Manager):
def get_by_natural_key(self, url):
return self.get(url=url)
class Link(models.Model):
objects = LinkManager()
title = models.CharField(max_length=200)
url = models.URLField()
def natural_key(self):
return (self.url, )
如果我导出并重新导入数据,Django 会识别出对象已经存在并且不会创建重复项。如果我更改标题,它会正确更新对象。但是,如果我更改 URL,它会正确地将其视为新对象 - 尽管我忘记标记url
独特的!它如何猜测我的意图?
django 怎么知道我的url
字段是自然键吗?没有get_natural_fields
功能。姜戈可以打电话natural_key
on the class而不是获取字段的实例,但这看起来真的很脆弱:
>>> [f.field_name for f in Link.natural_key(Link)]
['url']
我想知道这一点的原因是我正在编写自己的特殊导入器(以替换我对 loaddata 的使用),并且我想利用自然键而不对每个的自然键(或“识别”字段)进行硬编码模型。目前,我通过对象的唯一字段“识别”对象 - 我这样做:
obj, created = Model.objects.update_or_create(**identifying, defaults=other)
但 Django 似乎以不同的方式选择它的“识别”字段。