如果数据库中不存在每个字典的唯一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块应该如何工作?
(注意主键自动字段id是否可以是非顺序的,这样我就可以将字典中的唯一id存储在默认的Model id字段中,而不需要额外的唯一id列?)
实现此目的的最佳方法是使用update_or_create方法,方法与Javier的响应类似。
thing, created = Thing.object.update_or_create(
unique_id=dict1['unique_key'],
defaults={'property': dict1['other_key']}
)
您最好这样做:
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
主键自动字段id可以是非顺序的,这样我就可以将字典中的唯一id存储在默认的模型id字段中,而不需要额外的唯一id列?
是的,是的,它可以。我重写了内置的散列,以返回记录的唯一标识符。下面是一个简单的散列字典函数:
def __hash__(self):
hash_value = sum([hash(v) for v in self.values()])
return hash_value