Итерация по полям с использованием массива 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.

Вернуться на верх