2017-12-20 30 views
2

나는 다음과 같은 기능을 가지고 :어떻게 문자열을 인수 이름으로 전달합니까?

def create_act(user, verb, fk_name=None, fk_value=None): 
    fk = getattr(Action, fk_name) 
    action = Action(user=user, verb=verb, fk=fk_value) 
    action.save() 

액션 클래스입니다. 클래스에는 여러 속성이 있으며 처음에는 어떤 속성이 값을 얻을지 모르겠습니다.

나는 동적 인 속성 이름을 얻습니다.

나는 kwarg fk을 클래스 동작의 실제 속성으로하고 싶습니다. FK는 계정 또는 회사 일 수 있습니다.

class Action(models.Model): 

account = models.ForeignKey(Account, blank=True, null=True, related_name='activity', on_delete=models.CASCADE) 
company = models.ForeignKey(Company, blank=True, null=True, related_name='activity', on_delete=models.CASCADE) 

나는 나에게 포럼에 대한 몇 가지 대답하지만 관련 아무것도 발견, 또는 파이썬한다. 다른 사이트에서 eval을 사용하라는 제안을 보았지만 eval은 안전하지 않습니다.

+0

유용한 링크입니다 : https://stackoverflow.com/questions/3394835/args-and-kwargs –

+0

당신은 몇 가지 예를 준 경우가 도움이 될 것입니다 * 값 속성과 사전 풀기를 사용하여 그것을 따라 통과 * 및 어떤 종류의 호출을 에뮬레이션 할 것인지 예를 들어보십시오. 'Action (.., fk = ...) '에서'fk'는'fk' 변수에 기반한 변수 값이어야한다고 말하고 싶습니까? '액션 (..., foo = fk_value)'? – deceze

+0

@deceze 더 많은 정보가 추가되었습니다. django는 인스턴스를 만들고 fk는 외래 키입니다 – user3541631

답변

5

**으로 포장을 풀고 dict을 사용하십시오. 참고 - fk_nameForeignKey - fk의 이름 인 경우 문자열이 아니지만 ForwardManyToOneDescriptor이됩니다. 당신은 아마 아직도 fk_name라는 이름의 속성을 설정할 것 :

action = Action(user=user, verb=verb, **{fk_name: fk_value}) 
+1

Dict 언 패킹은 옳다. 그러나 모든 점은 확실하게'fk' *가 문자열이 아니다. –

+0

@DanielRoseman fk_name은 초기 함수의 인수이며 문자열입니다. getattr을 사용하지 않고 직접 사용할 수 있습니까? – user3541631

+2

@DanielRoseman 글쎄, 동적 키워드 할당을 달성하기 위해 어떤 형식을 사용할 수 있는지 보여줍니다. OP의 문제는 이것으로 번역 가능해야합니다. – Arne

1

아이디어는 동적으로 이름/값을 사용하여 사전을 만들고, 그렇게, 클래스 생성에 속성 이름과 값의 쌍을 전달하는 것입니다 여기

def create_act(user, verb, name, value): 
    attrs = {name: value} 
    action = Action(user=user, verb=verb, **attrs) 
    action.save() 
    return action