如果数据库中不存在每个字典的唯一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列吗?)
答案 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
我希望有所帮助。