2012-09-12 61 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