在 Django 上更新数据库中的模型对象
Updating model objects in the database on Django
我是 Django 的新手,出于学习目的,我正在尝试使用 linkedn API 构建自己的网站来显示我的个人资料。以下是我的代码示例。要查看全部:
https://github.com/javiee/django-site
models.py
class Profile(models.Model):
user = models.ForeignKey(User)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
def __str__(self):
return self.first_name, self.last_name
class Education(models.Model):
user = models.ForeignKey(User)
school_name = models.CharField(max_length=100)
field_study = models.CharField(max_length=100)
degree = models.CharField(max_length=100)
start_date = models.CharField(max_length=20)
end_date = models.CharField(max_length=20)
和views.py
profile = Profile(first_name = content['firstName'],
last_name = content['lastName'],
user = request.user)
profile.save()
#Education model
content_educ = content['educations']['values']
for value in content_educ:
education = Education(school_name = value['schoolName'],
user = request.user,
field_study = value['fieldOfStudy'],
degree = value['degree'],
start_date = value['startDate']['year'] ,
end_date = value['endDate']['year'])
education.save()
一切正常,但我的问题是每次检查 linkedn 时,代码都会再次保存所有对象。理想情况下,它会在调用 .save() 方法时基于配置文件 "update" 字段。我看了下linkhttps://docs.djangoproject.com/en/1.7/ref/models/instances/#saving-objects
但我无法让它工作,也许外键设置不正确,所以任何 advise/help/tip 将不胜感激。谢谢!
使用update_or_create()
方法:
Education.objects.update_or_create(
school_name=value['schoolName'],
user = request.user,
defaults={'field_study': value['fieldOfStudy'],
'degree': value['degree'],
'start_date': value['startDate']['year'] ,
'end_date': value['endDate']['year']})
您遇到的问题是您在这些行中实例化了新的教育实例:
education = Education(school_name = value['schoolName'],
user = request.user,
field_study = value['fieldOfStudy'],
degree = value['degree'],
start_date = value['startDate']['year'] ,
end_date = value['endDate']['year'])
当 Django 尝试保存这些新实例(id
尚未定义的实例)时,Django 继续插入记录而不是执行您想要的更新。
要进行更新,您可以尝试获取记录,捕获 DoesNotExist
异常:
try:
education = Education.objects.get(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
except Education.DoesNotExist:
education = Education(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
然后应用任何更新 want/need。
或者您可以使用 get_or_create
做同样的事情:
(education, created) = Education.objects.get_or_create(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
如果您不想通过所有这些值(它们是 AND 运算)查找您的实例,但想用某些值初始化新实例,您应该查找 defaults
get_or_create
.
的关键字
或者您可以按照 catavaran 的建议使用 update_or_create
。
编辑:或者,如果您只想直接更新记录而不获取它(这也适用于同时处理多个对象),您可以使用 queryset.update
Education.objects.filter(attribute=value, ...).update(attribute2=value2, ...)
我是 Django 的新手,出于学习目的,我正在尝试使用 linkedn API 构建自己的网站来显示我的个人资料。以下是我的代码示例。要查看全部:
https://github.com/javiee/django-site
models.py
class Profile(models.Model):
user = models.ForeignKey(User)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
def __str__(self):
return self.first_name, self.last_name
class Education(models.Model):
user = models.ForeignKey(User)
school_name = models.CharField(max_length=100)
field_study = models.CharField(max_length=100)
degree = models.CharField(max_length=100)
start_date = models.CharField(max_length=20)
end_date = models.CharField(max_length=20)
和views.py
profile = Profile(first_name = content['firstName'],
last_name = content['lastName'],
user = request.user)
profile.save()
#Education model
content_educ = content['educations']['values']
for value in content_educ:
education = Education(school_name = value['schoolName'],
user = request.user,
field_study = value['fieldOfStudy'],
degree = value['degree'],
start_date = value['startDate']['year'] ,
end_date = value['endDate']['year'])
education.save()
一切正常,但我的问题是每次检查 linkedn 时,代码都会再次保存所有对象。理想情况下,它会在调用 .save() 方法时基于配置文件 "update" 字段。我看了下linkhttps://docs.djangoproject.com/en/1.7/ref/models/instances/#saving-objects
但我无法让它工作,也许外键设置不正确,所以任何 advise/help/tip 将不胜感激。谢谢!
使用update_or_create()
方法:
Education.objects.update_or_create(
school_name=value['schoolName'],
user = request.user,
defaults={'field_study': value['fieldOfStudy'],
'degree': value['degree'],
'start_date': value['startDate']['year'] ,
'end_date': value['endDate']['year']})
您遇到的问题是您在这些行中实例化了新的教育实例:
education = Education(school_name = value['schoolName'],
user = request.user,
field_study = value['fieldOfStudy'],
degree = value['degree'],
start_date = value['startDate']['year'] ,
end_date = value['endDate']['year'])
当 Django 尝试保存这些新实例(id
尚未定义的实例)时,Django 继续插入记录而不是执行您想要的更新。
要进行更新,您可以尝试获取记录,捕获 DoesNotExist
异常:
try:
education = Education.objects.get(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
except Education.DoesNotExist:
education = Education(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
然后应用任何更新 want/need。
或者您可以使用 get_or_create
做同样的事情:
(education, created) = Education.objects.get_or_create(school_name=value['schoolName'],
user=request.user,
field_study=value['fieldOfStudy'],
degree=value['degree'],
start_date=value['startDate']['year'],
end_date=value['endDate']['year'])
如果您不想通过所有这些值(它们是 AND 运算)查找您的实例,但想用某些值初始化新实例,您应该查找 defaults
get_or_create
.
或者您可以按照 catavaran 的建议使用 update_or_create
。
编辑:或者,如果您只想直接更新记录而不获取它(这也适用于同时处理多个对象),您可以使用 queryset.update
Education.objects.filter(attribute=value, ...).update(attribute2=value2, ...)