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



如果数据库中不存在每个字典的唯一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

最新更新