3

まず、これをまとめるためのガイドとして使用したページです: https://docs.djangoproject.com/en/dev/topics/serialization/

これが私のモデル定義です:

class LocationManager(models.Manager):
    def get_by_natural_key(self, zip_code):
        return self.get(zip_code=zip_code)

class Location(models.Model):
    city = models.CharField('City', blank=True, null=True, max_length=50)
    state = models.CharField('State', blank=True, null=True, max_length=2, choices=STATE_CHOICES)
    zip_code = models.CharField('Zip Code', blank=False, null=False, max_length=9, unique=True)
    date_added = models.DateField('Date Added')

    objects = LocationManager()

    def natural_key(self):
        return self.zip_code

これは、逆シリアル化しようとしているシリアル化されたアイテムです。

    {
        "pk": 10259, 
        "model": "news.news", 
        "fields": {
            "content": "some content", 
            "created_on": "2012-07-24T16:10:44.570", 
            "location": "99801", 
            "title": "Some title"
        }
    }

jsonを逆シリアル化しようとしているコード:

    for news_obj in serializers.deserialize('json', news_json):
        news_obj.save()

私が得るエラーは次のとおりです。

IntegrityError: insert or update on table "news" violates foreign key constraint "news_location_id_fkey"
DETAIL:  Key (location_id)=(99801) is not present in table "location".

そのため、定義した自然キーを使用してアイテムがデータベースに存在するかどうかを確認しようとするのではなく、zip_code を自然キーとして解決しようとしているようです。私は何を間違っていますか?

4

1 に答える 1

4

私は自分に合った解決策を見つけました。自然キーは単一のフィールドではなくリストを期待しているようで、自然キーはフィールドの値の組み合わせとしてのみ計画されていると推測されます。リストでzip_codeを返すことでこれを解決しました。

def natural_key(self):
    return [self.zip_code]

これを行った後、逆シリアル化は私が望んでいたとおりに機能しました。

これを実行した後の結果のエンコードされたJSONは、次のようになりました。

{
    "pk": 10661, 
    "model": "news.news", 
    "fields": {
        "content": "", 
        "created_on": "2012-07-25T10:19:56.627", 
        "location": [
            "36101"
        ], 
        "article_date": "2012-07-25T10:05:56", 
        "title": ""
    }
}
于 2012-07-25T15:10:40.490 に答える