Использование необязательных **kwargs в python
Я в процессе рефакторинга кодовой базы на Python, где я все еще изучаю их синтаксический сахар, поэтому надеюсь, что смогу получить некоторую помощь от экспертов здесь.
Я хочу написать общую функцию, которая принимает список необязательных аргументов с помощью **kwargs
и делает вызов модели БД, используя список присутствующих аргументов. Например, если в вызове функции присутствуют 5 из 8 столбцов, то вызов create будет сделан с использованием этих 5 (остальные 3 уже принимают null в БД). Однако если я передам в функцию 7 значений, я должен иметь возможность использовать ту же функцию снова.
Вот о чем я думаю:
Класс контроллера ....
create(arg1=x, arg3=y, arg4=z, arg6=a, arg7=b)
create(arg1=x, arg2=x2, arg3=y, arg4=z, arg6=a, arg7=b, arg8=b2)
....
Модельный класс
arg1 = models.CharField(max_length=255, null=True, blank=True)
arg2 = models.CharField(max_length=255, null=True, blank=True)
arg3 = models.DateTimeField(null=True, blank=True)
arg4 = models.DateTimeField(null=True, blank=True)
arg5 = models.CharField(max_length=255, blank=True, null=True)
arg6 = models.CharField(max_length=255, blank=True, null=True)
arg7 = models.CharField(max_length=255, blank=True, null=True)
arg8 = models.BooleanField(null=True, blank=True)
def create(**kwargs):
DBMODEL.objects.create(
arg1=kwargs['arg1'],
arg2=kwargs['arg2'],
arg3=kwargs['arg3'],
arg4=kwargs['arg4'],
arg5=kwargs['arg5'],
arg6=kwargs['arg6'],
arg7=kwargs['arg7'],
arg8=kwargs['arg8']
)
Можно ли это сделать с помощью моего кода выше или есть другие предложения?
Конечная цель - иметь одну функцию для обслуживания нескольких вызовов с различным количеством аргументов без необходимости иметь несколько if и else в вызываемой функции класса модели.
Любые предложения/идеи будут оценены по достоинству. Это то, в чем официальная документация мне не очень помогла.
create
принимает **kwargs
, поэтому может быть использован следующим образом:
values = {"field1": 1, "field2": 2, "field3": 3}
DBMODEL.objects.create(**values) # same as DBMODEL.objects.create(field1=1, field=2, field3=3)
values = {"field1": 1, "field2": 2, "field3": 3, "field4": 4}
DBMODEL.objects.create(**values). # same as DBMODEL.objects.create(field1=1, field=2, field3=3, field4=4)