django orm - 检查模型字段中是否存在字典键?

时间:2015-10-15 11:18:13

标签: python django django-models

如果数据库中不存在每个字典的唯一ID,我有一系列要保存的字典。如果确实存在,最好检查每个键的值是否与数据库中的相应值相同,如果不存在则更新。 在Django中最好的方法是什么?

我正在思考以下几点:

if Thing.object.get(unique_id=dict1['unique_key']):
    thing = Thing()
    thing.unique_id = dict1['unique_key']
    thing.property = dict1['other_key']
    thing.save()

我不确定else块应该如何工作?

(注意主键autofield id可以是非顺序的,所以我可以在默认的Model id字段中存储dict中的唯一id,而不需要额外的唯一id列吗?)

3 个答案:

答案 0 :(得分:2)

实现此目的的最佳方法是以与Javier响应类似的方式使用update_or_create方法。

thing, created = Thing.object.update_or_create(
    unique_id=dict1['unique_key'], 
    defaults={'property': dict1['other_key']}
)

答案 1 :(得分:1)

最好的办法是:

from django.forms.models import modelform_factory
# Do NOT do this in your view for every request
# add this to your <app>/forms.py and import it (this is just an example)
ThingForm = modelfor_factory(Thing, exclude=[])
# end

# in your view
thing, created = Thing.object.get_or_create(
    unique_id=dict1['unique_key'], 
    defaults={'property': dict1['other_key']}
)

# already exist
if not created:
    form = ThingForm(dict1, instance=thing)
    # you can also see what changed using `form.changed_data`
    if form.has_changed():
         form.save()

在内部,它会完全按照您的要求行事,但在眼睛上更容易。

https://github.com/django/django/blob/master/django/db/models/query.py#L454

答案 2 :(得分:0)

  

主键autofield id是否可以是非顺序的,所以我可以在默认的Model id字段中存储dict中的唯一id,而不需要额外的唯一id列?

是的,是的,它可以。我重写hash内置函数以返回记录的唯一标识符。字典的简单哈希函数如下:

def __hash__(self):
    hash_value = sum([hash(v) for v in self.values()])
    return hash_value

我希望有所帮助。