Итерация по полям с использованием массива Django
У меня эта модель:
class Some_model(models.Model):
field_1 = models.CharField(max_length=200, blank=True, null=True)
field_2 = models.CharField(max_length=200, blank=True, null=True)
и эта функция:
# create a function to upload a model object given a json object
def upload_object_values(model, json_values, keys=None):
if json_values:
# assign a value to each key which is a the field in the given model
for key, value in json_values.items():
setattr(model, key, value)
# if the object has keys to check
if keys:
# check if exists using the keys
когда вызывается следующим образом:
upload_object_values(Some_model(), {'field_1': 'val', 'field_2': 'val_2'}, ['field_2'])
Это сделает get или create внутри функции upload_object_values
, используя поля внутри параметра keys (например: field_2
в качестве параметра).
Some_model.objects.get_or_create(field_2='val_2')
Вероятно, вы хотите подражать .update_or_create(…)
[Django-doc]. Вы можете сделать это с помощью:
def upload_object_values(model, json_values, keys=None):
model._base_manager.update_or_create(
**{key: json_values[key] for key in keys}
defaults={key: value for key, value in json_values.items() if key not in keys}
)
Вы должны здесь работать со ссылкой на модель class, а не модель object:
upload_object_values(Some_model, {'field_1': 'val', 'field_2': 'val_2'}, ['field_2'])
Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вSome_model
SomeModel
.