2017-12-20 3 views
2

Ich habe die folgende Funktion:Wie gebe ich eine Zeichenfolge als Argumentnamen?

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() 

Aktion eine Klasse ist. Die Klasse hat mehrere Attribute, und ich weiß zu Beginn nicht, welches Attribut einen Wert erhalten wird.

Ich bekomme den Attributnamen dynamisch.

Ich möchte die Kwarg fk, ein tatsächliches Attribut der Sammelklage sein. FK kann Konto oder Firma sein.

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) 

ich in den Foren fand einige Antworten, aber nichts für mich relevant oder in Python. Ich habe einige Vorschläge auf anderen Websites gesehen, um eval zu verwenden, aber eval ist nicht sicher.

+0

hier ist ein hilfreicher Link: https://stackoverflow.com/questions/3394835/args-and-kwargs –

+0

es wäre hilfreich, wenn Sie einig Beispiel gibt * Werte * und ein Beispiel dafür, welche Art von Anruf Sie emulieren möchten. Versuchen Sie zu sagen, dass "fk" in "Action (.., fk = ...)" ein variabler Wert sein sollte, basierend auf der 'fk'-Variable, z. 'Aktion (..., foo = fk_value)'? – deceze

+0

@deceze mehr Info hinzugefügt, ist Django ich erstelle eine Instanz und fk ist ein Fremdschlüssel – user3541631

Antwort

5

Verwenden Sie dict Entpacken mit **. Beachten Sie, dass - wenn fk_name ist der Name einer ForeignKey - fk wird keine Zeichenfolge, sondern eine ForwardManyToOneDescriptor sein. Sie würden wahrscheinlich immer noch wollen, um das Attribut gesetzt fk_name genannt:

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

Dict-Entpacken ist richtig, aber der springende Punkt ist sicherlich, dass 'fk' * keine Zeichenfolge ist. –

+0

@DanielRoseman fk_name das ist das Argument der ursprünglichen Funktion ist eine Zeichenfolge, kann ich direkt ohne getattr verwenden? – user3541631

+2

10 @DanielRoseman Nun, es zeigt immer noch, welche Form verwendet werden kann, um dynamische Keyword-Zuweisung zu erreichen. Das Problem von OP sollte in dieses übersetzt werden können. – Arne

1

Die Idee ist, dynamisch ein Paar von Attributnamen und dem Wert der Klasse Schöpfung passieren, das zu tun, erstellen Sie einen Wörterbuch der Namen/Wert mit Attribut und gibt ihm Wörterbuch auspacken zusammen mit:

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