Solución:
Esta es más una pregunta de Python.
Python es un lenguaje muy dinámico. Puede codificar cosas (clases) con anticipación, o Python le permite crear clases de forma completamente dinámica en tiempo de ejecución. Considere el siguiente ejemplo de una clase de vector simple. Puede crear / codificar la clase con anticipación como:
class MyVector(object):
x = 0
y = 0
o puede crear la clase dinámicamente haciendo:
fields = {'x':0, 'y':0}
MyVector = type('MyVector', (object,), fields)
La principal diferencia entre los métodos es que, para uno, conoce los atributos de la clase de antemano, mientras que para el segundo método, como puede imaginar, puede crear mediante programación el fields
diccionario, por lo tanto, puede crear clases de forma completamente dinámica.
Entonces, cuando conozca los atributos de la clase de antemano, puede establecer los atributos de la clase utilizando la notación de objeto:
instance.attribute = value
Tenga en cuenta que eso equivale a:
instance.__setattr__("attribute", value)
Sin embargo, hay escenarios en los que no conoce los atributos de clase que deberá manipular con anticipación. Aquí es donde puedes usar __setattr__
función. Sin embargo, no es una práctica recomendada. Entonces, en cambio, la recomendación es usar el método incorporado de Python setattr
que llama internamente al __setattr__
método:
setattr(instance, attribute, value)
Con este enfoque, puede establecer atributos que no conoce de antemano o incluso puede realizar un bucle de algunos dict
y establecer valores de dict:
values = {
'title': 'This is edit title',
...
}
for k, v in values.items():
setattr(ticket, k, v)
No estoy seguro de por qué no funcionó la notación regular. Probablemente no tenga nada que ver con el método que usó para establecer atributos.
Si conoce las propiedades de los objetos de antemano, probablemente debería utilizar el primer método. Simplemente asigne valores de propiedad directamente.
El segundo puede resultar útil cuando necesite asignar dinámicamente un valor a una propiedad. Quizás un usuario tiene la capacidad de cambiar los valores de varios atributos diferentes y no sabe cuál tendrá un valor de antemano, puede agregar valores dinámicamente
possible_fields = ['title', 'looser_ticket']
ticket = Ticket.objects.get(pk=1)
for field in possible_fields:
if request.GET.get(field):
setattr(ticket, field, request.GET[field])
El “no funciona” probablemente no depende de la forma en que esté configurando los valores, ¿está seguro de que guardó los cambios después?