2016-04-06 6 views
4

У меня есть этот код:Как передать имя аргумента в качестве параметра?

hobbies2 = form.cleaned_data.pop('hobbies2') 
PersonneHobby.objects.filter(personne=obj).delete() 
for pk_str in hobbies2: 
    try: 
     hobby = TagTraduit.objects.get(pk=int(pk_str)) 
     p = PersonneHobby.objects.create(personne=obj, 
             hobby=hobby) 
     p.save() 
    except ValueError: 
     break # hack in the POST 
    except LookupError: 
     break # hack in the POST 

у меня будет один и тот же код для 4-х различных полей, Exemple с programme:

programmes2 = form.cleaned_data.pop('programmes2') 
PersonneProgramme.objects.filter(personne=obj).delete() 
for pk_str in programmes2: 
    try: 
     programme2 = TagTraduit.objects.get(pk=int(pk_str)) 
     p = PersonneProgramme.objects.create(personne=obj, 
              programme=programme2) 
     p.save() 
    except ValueError: 
     break # hack = tout stopper 
    except LookupError: 
     break # hack = tout stopper 

Точно такой же код, только имя изменения поля. Так что я хотел бы сделать обобщенную функцию и называть его так:

def update_field(post_field, class_field, **kwargs): 
    try: 
     values = form.cleaned_data.pop(post_field) 
     class_field.objects.filter(personne=obj).delete() 
     for pk_str in values: 
      try: 
       v = TagTraduit.objects.get(pk=int(pk_str)) 
       p = class_field.objects.create(**{'personne': obj, 
                field_name: v}) 
       p.save() 
      except ValueError: 
       break # hack = tout stopper 
      except LookupError: 
       break # hack = tout stopper 
    except KeyError: 
     pass 
update_field('programmes2', PersonneProgramme, 'programme') 
update_field('hobbies2', PersonneHobby, 'hobby') 

Моя главная проблема заключается в последний параметр, который является именем поля, чтобы использовать при создании записи в базе данных.

Как это сделать?

ответ

4

Вы можете сделать это с произвольным количеством ключевых слов-аргументы (**) и вставить рассчитанные дополнительные параметры внутри функции:

def update_field(field, update_this, **kwargs): 
    ... 
    kwargs[update_this] = TagTraduit.objects.get(pk=int(pk_str)) 
    p = field.objects.create(**kwargs) 
    ... 

это позволяет назовем это так:

update_field(PersonneHobby, 'hobby', personne=obj) 
update_field(PersonneProgramme, 'programme', personne=obj) 
3

Вы можете сделать это:

def update_field(..., field_name): 
    ... 
    tag = TagTraduit.objects.get(pk=int(pk_str)) 
    p = PersonneProgramme.objects.create(**{'personne': obj, field_name: tag}) 
+0

Я обновил мой вопрос, используя kwargs, вы увидите, что я имею в виду. –

1

Я поеду с тем, что сказал @MSeifert. Если вы хотите, чтобы все, что вы написали для работы, я имею в виду только с позиционными аргументами.

def f(a,b,c): 
    a.func(b=b, c=c) # this is perfectly legal 

Но лучше пойти о нем,

def f(a, **kwargs): 
    a.func(**kwargs) # kwargs is passed as a dict. **kwargs is 
         # unpacking it into key1=val1, key2=val2, ... 
+0

Я обновил свой вопрос, используя kwargs, вы увидите, что я имею в виду. –

+1

Разве это не ответ «Я согласен»? – Sayse

+0

@Sayse Вы могли бы сказать, что если вы ненавидите мои кишки по какой-то причине. И нет. Это больше. Посмотрите на первый блок. Он не был уверен в сборе 'c' из' (a, b, c) 'as' (..., c = c) ' –

Смежные вопросы