2012-09-12 114 views
0

假設我有以下函數,它以用戶定義對象的形式從服務器檢索數據。例如,我們將對象定義爲PersonalEntry。Django:更新模型的正確方法

def retrieve_people() 
    // returns a list of all latest people objects, with fields equal to those in PersonEntry 

def retrieve_books() 
    // returns a list of all latest book objects regardless of author, with fields equal to those in BookEntry, contains attribute, 

這兩個用戶定義的類都有一個.as_dict()方法,該方法返回字典中的所有屬性。

無論何時調用此函數(即更新字段,如果該模型的實例已存在,否則定義模型的新實例),我都想更新模型。這是我目前的設置。

class PersonEntry(models.Model): 
    name = models.CharField(max_length = 50) 
    age = models.IntegerField() 
    biography = models.CharField(max_length = 200) 

    def update_persons(): 
     try: 
      temp = retrieve_person() 
      for person in temp: 
       match = PersonEntry.objects.filter(name = person.name(), age = person.age()) 
       match.update(**person.as_dict()) 
     except DoesNotExist: 
      PersonEntry.create(**person.as_dict()) 


class BookEntry(models.Model): 
    author = models.ForeignKey(PersonEntry) 
    author_name = models.CharField(max_length = 50) //books return redundant info 
    author_age = models.IntegerField() //books return redundant info 
    title = models.CharField(max_length = 50) 
    summary = models.CharField(max_length = 200) 

    def update_books(): 
     try: 
      temp = retrieve_books() 
      for book in temp: 
       match = BookEntry.objects.filter(title = temp.title()) 
       match.update(**book.as_dict(), associate_person(book.author_age(), book.author_name())) 
     except DoesNotExist: 
      BookEntry.create(**book.as_dict(), associate_person(book.author_age(), book.author_name()) 

    def associate_person(age, name): 
     return PersonEntry.get(name = name, age = age) 

我想一個更一般的問題是,如果我有一個函數返回數據,我該如何更新與關係模型?我是否在模型本身有一個方法,或者我有它一級(即將update_books移動到Person模型)我是Django的新手,所以不太確定組織應該如何。

回答

0

我承認我還沒有完全grokked你的問題,但我會採取平底船,你應該看看

Managers

一般來說,在Django,一切都如懶洋洋地做越好 - 這意味着除非你真正嘗試使用它,否則什麼都不會更新 - 所以你不會隨着你去更新模型/關係,而只是聲明它們是什麼(可能與一個管理者),然後它只在被問到時纔將其當作現值。

0

返回某種模型的集合(或查詢集合)的方法應該是Managers的一部分。因此,在您的情況下,update_books應該位於BookEntry的自定義管理器中,而update_persons應位於PersonEntry的自定義管理器中。

也不要在模型或管理器中調用功能retrieve_*。在應用程序邏輯中調用它,然後將結果傳遞給管理器方法,除非該方法本身是管理器/模型的一部分。

您不需要單獨的filterupdate方法。根據您檢索數據的方式,您可以直接執行save。見How Does Django Know when to create or update