【发布时间】:2017-10-29 11:36:39
【问题描述】:
我正在使用 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 功能。 Django 可以在 class 上调用 natural_key 而不是实例来获取字段,但这似乎很脆弱:
>>> [f.field_name for f in Link.natural_key(Link)]
['url']
我想知道这一点的原因是我正在编写自己的特殊导入器(以替换我对 loaddata 的使用),并且我想利用自然键而不对自然键(或“识别”字段)进行硬编码) 对于每个模型。目前,我通过它的唯一字段“识别”一个对象 - 我这样做:
obj, created = Model.objects.update_or_create(**identifying, defaults=other)
但 Django 似乎选择了不同的“识别”字段。
【问题讨论】:
标签: python django django-orm