Djangoのdumpdataを使用してデータを保存し、loaddataを使用して再読み込みしています。私は自然なキーも使用しています。私のモデルは次のようになります。Djangoのロードデータは、どのフィールドがナチュラルキーを作るのかを知っていますか?
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
というマークは忘れてしまいました!私の意図はどうやって推測されますか?
私のurl
フィールドが自然なキーであることをdjangoはどのように知っていますか? get_natural_fields
機能はありません。 Djangoはフィールドを取得するには、インスタンスの代わりにクラスに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はそれが違ったフィールドを「特定」が選択しているように見えます。