2017-11-22 7 views
1

私はdjangoプロジェクトを操作して、データベース同期のためにオブジェクトによってオブジェクトを削除したいので、jsonファイルに保存することにしました。このために、モデルのdelete()メソッドをオーバーライドします。 私はまず、以前に削除したオブジェクトをファイルから探し出し、削除するオブジェクトを追加します。この新しいリストをシリアル化すると、AttributeErrorが返されます。削除時にモデルオブジェクトをシリアライズするときのAttributeError

AttributeError: 'DeserializedObject' object has no attribute '_meta'

私は間違っていますか?ここで

は、削除()のコードです:ドキュメントで述べたように

def delete(self, *args, **kwargs): 
    force = kwargs.pop("force", None) 

    if force is None: 
     objects_to_delete = list() 
     user_dir_path = os.path.join(STATIC_ROOT, self.user.username) 
     if not os.path.exists(user_dir_path): 
      os.makedirs(user_dir_path) 
     path = os.path.join(user_dir_path, "obj_to_delete.json") 
     if os.path.exists(path): 
      with open(path, "r") as fp: 
       json_str = fp.read() 
       if len(json_str) > 0: 
        objects_to_delete = list(serializers.deserialize(
         "json", 
         json_str, 
         indent=4, 
         use_natural_foreign_keys=True, 
         fields=('pk', 'user', 'slug') 
         )) 

     objects_to_delete.append(self) 

     if objects_to_delete: 
      with open(path, "w") as fp: 
       jsonData = serializers.serialize("json", 
        objects_to_delete, indent=4, 
        use_natural_foreign_keys=True, 
        fields=('pk', 'user', 'slug') 
       ) 
       fp.write(jsonData) 

    super(UserOwnedModel,self).delete(*args, **kwargs) 

答えて

1

https://docs.djangoproject.com/en/1.11/topics/serialization/#deserializing-data

、シリアライザからのデシリアライズ方法は、直接あなたのオブジェクトを返すのではなくDeserializeObjectでそれをラップしていません。たとえば、オブジェクトにアクセスするためにdeserialized_object.objectを呼び出す必要があります。

あなたは代わりに、これを試すことができます。

objects_to_delete = list(obj.object for obj in serializers.deserialize(
    "json", 
    json_str, 
    indent=4, 
    use_natural_foreign_keys=True, 
    fields=('pk', 'user', 'slug') 
    )) 
関連する問題