Django Save Model Idiom

时间:2013-01-26 21:50:18

标签: django django-models idioms

让我们说你有一个ActiveDirectoryUser模型:

class ActiveDirectoryUser(models.Model):
    object_guid = models.CharField(max_length=200, unique=True)
    mail = models.EmailField(unique=True)
    name = models.CharField(max_length=200)

此模型是从Active Directory查询填充的。每天,我都会批量重新运行查询Active Directory的工作,获取结果,并检查此人是否已在AD中。如果是,它会检查是否有任何更改,如果没有,它们会被添加到数据库中。我发现自己在写:

try:
    ad_user = ActiveDirectoryUser.objects.get(object_guid=object_guid)
    ad_user.object_guid = object_guid
    ad_user.mail = mail
    ad_user.name = name
    ad_user.save()

except ActiveDirectoryUser.DoesNotExist:
    ActiveDirectoryUser(
    object_guid=object_guid,
    mail=mail, 
    name=name).save()

基本上,我尝试使用属性获取对象,如果抛出一个DoesNotExist异常,我知道它不存在,所以我创建了一个新的。这是更新或将新对象保存到数据库中的正确/最佳/惯用方法吗?我知道它有效,但它看起来有点不对劲。不雅。

1 个答案:

答案 0 :(得分:1)

不,django有built-in方法可以做到这一点。

entry, created = ActiveDirectory.objects.get_or_create(
    object_guid = 'your_value',
    name =  = 'your_value',
    mail = 'your_value'
)