首先,这是我用作指南的页面: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 解析为自然键,而不是尝试使用我定义的自然键检查该项目是否存在于数据库中。我做错了什么?
最佳答案
我找到了适合我的解决方案。看起来自然键需要一个列表而不是单个字段,猜测他们只是计划自然键是字段值的组合。我通过返回列表中的邮政编码解决了这个问题。
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": ""
}
}
关于Django 反序列化 - 我已经指定了一个自然 key 管理器,但它不会反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11650824/