Django反序列化 - 我已经指定了一个自然的密钥管理器,但它不会反序列化

时间:2012-07-25 13:28:44

标签: django serialization

首先,这是我用作指南的页面: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解析为自然键,而不是尝试使用我定义的自然键来检查数据库中是否存在该项。我做错了什么?

1 个答案:

答案 0 :(得分: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": ""
    }
}