假设我有以下函数,它以用户定义的对象的形式从服务器检索数据。例如,让我们将对象定义为PersonalEntry。
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 :(得分:0)
我承认我没有完全理解你的问题,但我会采取一个你应该研究的平底船
通常,在django中,所有内容都尽可能地延迟完成 - 这意味着在您真正尝试使用它之前不会更新任何内容 - 因此您不会随时更新模型/关系,而只是声明它们是什么(也许与经理一起)然后只有在被问到时才能将当前值计算出来。
答案 1 :(得分:0)
返回某种模型的集合(或查询集)的方法应该是Managers的一部分。因此,在您的情况下,update_books
应位于BookEntry
的自定义管理器中,而update_persons
应位于PersonEntry
的自定义管理器中。
也不要从模型或经理内部调用函数retrieve_*
。在您的应用程序逻辑中调用它,然后将结果传递给manager方法,除非该方法本身是管理器/模型的一部分。
您不需要单独的filter
和update
方法。根据您检索数据的方式,它有pk
,您可以直接执行save
。见How Does Django Know when to create or update