2016-12-12 8 views
-1

私は削除メソッドの実装に問題があります。 Delete *メソッドはすべてのノートを削除する必要があります。例:Note.objects.filter(board = 'in progress')。delete() - ボードが「進行中」のすべてのノートを削除する必要があります。私の最大の問題は、jsonファイルの変更を保存することです。 質問です:とメモを削除するとjsonファイルの変更を維持する方法メソッドを削除しますか?ここでjsonファイルの変更を保存するには

def delete(self): 
    all_notes = [note for note in Note.objects.all()] # try to delete note with index 1 
    for note in all_notes: 
     if note.id == 1: 
      all_notes.pop(0) 
    for note in all_notes: 
     print note 
     note.save() 

コードです:一般的に

# coding: utf-8 
from __future__ import unicode_literals 
from shutil import copyfile 
import json 
import os 

DATABASE = 'notes_data/notes.json' 
BOARDS = ['to do', 'in progress', 'done'] 


class NotesManagerMixin(object): 

    def count(self): 
     return len(self.notes) 

    def filter(self, *args, **kwargs): 
     result = self.notes 
     for key, value in kwargs.iteritems(): 
      result = [ 
       note for note in result 
       if getattr(note, key, None) == value or 
       note.message.startswith(value) or 
       note.message.endswith(value) 
      ] 
     return NotesQueryset(result) 

    def get(self, *args, **kwargs): 
     notes = self.filter(**kwargs) 
     if notes.count() == 0: 
      raise IndexError('Note doesn\'t exist') 
     elif notes.count() == 1: 
      return notes[0] 
     else: 
      raise IndexError('Returned more then one entry') 

    def first(self): 
     return self.notes[0] 

    def last(self): 
     return self.notes[-1] 


class NotesQueryset(NotesManagerMixin): 

    def __init__(self, notes): 
     self.notes = [note for note in notes] 

    def update(self, *args, **kwargs): 
     notes = self.notes 
     for note in notes: 
      if 'board' in kwargs: 
       note.board = kwargs['board'] 
       note.save() 
      if 'message' in kwargs: 
       note.message == kwargs['message'] 
       note.save() 



    def delete(self): 
     all_notes = [note for note in Note.objects.all()] # try to delete note with index 1 
     for note in all_notes: 
      if note.id == 1: 
       all_notes.pop(0) 
     for note in all_notes: 
      print note 
      note.save() 



    def __getitem__(self, idx): 
     return self.notes[idx] 

    def __str__(self): 
     return str(self.notes) 

    def __repr__(self): 
     return self.__str__() 


class NotesManager(NotesManagerMixin): 

    def __init__(self): 
     self.notes = [] 

    def __iter__(self): 
     return self.next() 

    def __generate_id(self): 
     """ 
      Funkcja pomocnicza do pobrania pewnej wolnej wartości indexu. 
     """ 
     try: 
      return max(note.id for note in self.notes) + 1 
     except ValueError: 
      return 1 

    def all(self): 
     return NotesQueryset(self.notes) 

    def add(self, idx, board, message): 
     self.notes.append(Note(idx=idx, board=board, message=message)) 

    def create(self, board, message): 
     note = Note(
      idx=self.__generate_id(), 
      board=board, 
      message=message 
     ) 
     note.clean() 

     self.notes.append(note) 
     note.save() 

     return note 

    def next(self): 
     for note in self.notes: 
      yield note 

    def to_dict(self): 
     return [note.to_dict() for note in self.notes] 


class Note(object): 
    objects = NotesManager() 

    def __init__(self, idx, board, message): 
     self.id = idx 
     self.board = board 
     self.message = message 

    def __str__(self): 
     return 'ID: {}, Board: {}, Message: {}'.format(
      self.id, 
      self.board, 
      self.message 
     ) 

    def __repr__(self): 
     return self.__str__() 

    def clean(self): 
     if not self.message: 
      raise ValueError('Message is required') 

     if self.board not in BOARDS: 
      raise ValueError('Board "{}" doesn\'t exists'.format(self.board)) 

     if type(self.id) != int: 
      raise ValueError('Note id "{}" is invalid'.format(self.id)) 

    def save(self): 
     for key, note in enumerate(self.objects): 
      if note.id == self.id: 
       self.objects.notes[key] = self 
       break 

     with open(DATABASE, 'w') as database_file: 
      json.dump(self.objects.to_dict(), database_file, indent=4) 

     return True 

    def delete(self): 
     # delete just one note 
     pass 

    def to_dict(self): 
     return { 
      'id': self.id, 
      'message': self.message, 
      'board': self.board 
     } 


def load_initial_data(): 

    with open(DATABASE, 'r') as database_file: 
     json_data = json.load(database_file, encoding='utf-8') 

    for item in json_data: 
     Note.objects.add(
      idx=item['id'], 
      board=item['board'], 
      message=item['message'], 
     ) 


load_initial_data() 
+1

質問をするのを忘れてしまった! –

+0

申し訳ありません、今は良いですか? –

答えて

0

、ファイルを変更する方法が変更されたデータで全体を上書きすることです。したがって、メモリ内のデータを変更した後は、saveメソッドが既に必要な処理を行っているはずです。

deleteは、保存中のNote.objectsデータを変更していないため、リスト内包語[note for note in Note.objects.all()]によって作成された一時的な配列が変更されています。だからsaveに電話すると元のデータが再び保存されます。

+0

mothodは問題なく保存できますが、この方法ではできません。理由はわかりません –

+1

私はこのようにループを開始する必要があります。 ** Note.objects.all()内の注釈:** –

関連する問題