在 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, ...)