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

标签 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 解析为自然键,而不是尝试使用我定义的自然键检查该项目是否存在于数据库中。我做错了什么?

最佳答案

我找到了适合我的解决方案。看起来自然键需要一个列表而不是单个字段,猜测他们只是计划自然键是字段值的组合。我通过返回列表中的邮政编码解决了这个问题。

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/

相关文章:

python - Django Ajax 和响应循环

python - 如何使用 Django Rest Framework 对序列化字段进行排序

c++ - 使用 boost::serialization 序列化递归图结构时如何防止堆栈溢出?

c# - 属性不会序列化到 .designer.cs 文件中

c# - "System.Web.HttpContext cannot be serialized because it does not have a parameterless constructor."

java - 反序列化 Gson 中的通用列表

python - Django - NullBooleanField 不会保留自定义 save() 方法中的 False 值

django - 在 Django 项目中映射主要 URL 的最佳方式是什么?

python - 如何在 django 序列化器 SlugRelatedField 中获取反向关系

android - 在 django 服务器中获取 Android POST 的数据