Django查询更新——字段由字符串决定
Django query update - the field is determined by a string
我想更新一条记录,但是字段是由字符串决定的。可以这样做吗?
这是我的模型:
class Wallet(models.Model):
user_id = models.IntegerField(blank=True, null=True)
wallet1 = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
wallet2 = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
这是我的代码:
amount = 200
transfer_from = 'wallet1'
transfer_to = 'wallet2'
obj = Wallet.objects.get(user_id=1)
obj.transfer_from = obj.transfer_from - amount
obj.transfer_to = obj.transfer_to + amount
obj.save()
Django 只在我写这个的时候识别字段:
obj.wallet1 = obj.wallet1 - amount
但它无法识别:
transfer_from = 'wallet1'
obj.transfer_from = obj.transfer_from - amount
表示'Wallet'对象没有属性'transfer_from'。谢谢。
实际上这是一个 Python 问题。
请参考:What is getattr() exactly and how do I use it?
使用 getattr
,您可以执行以下操作:
transfer_from_label = 'wallet1'
transfer_from = getattr(obj, transfer_from_label)
transfer_from = transfer_from - amount
这没有经过测试,但应该可以。
amount = 200
transfer_from = 'wallet1'
transfer_to = 'wallet2'
obj = Wallet.objects.get(user_id=1)
transfer_from_field_val = getattr(obj,transfer_from)
transfer_to_field_val = getattr(obj,transfer_to)
transfer_from_field_val = transfer_from_field_val - amount
transfer_to_field_val = transfer_to_field_val + amount
setattr(obj , transfer_from, transfer_from_field_val)
setattr(obj , transfer_to, transfer_to_field_val)
obj.save()
setattr(obj, transfer_form, getattr(obj, transfer_form) - amount)
我想更新一条记录,但是字段是由字符串决定的。可以这样做吗?
这是我的模型:
class Wallet(models.Model):
user_id = models.IntegerField(blank=True, null=True)
wallet1 = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
wallet2 = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
这是我的代码:
amount = 200
transfer_from = 'wallet1'
transfer_to = 'wallet2'
obj = Wallet.objects.get(user_id=1)
obj.transfer_from = obj.transfer_from - amount
obj.transfer_to = obj.transfer_to + amount
obj.save()
Django 只在我写这个的时候识别字段:
obj.wallet1 = obj.wallet1 - amount
但它无法识别:
transfer_from = 'wallet1'
obj.transfer_from = obj.transfer_from - amount
表示'Wallet'对象没有属性'transfer_from'。谢谢。
实际上这是一个 Python 问题。 请参考:What is getattr() exactly and how do I use it?
使用 getattr
,您可以执行以下操作:
transfer_from_label = 'wallet1'
transfer_from = getattr(obj, transfer_from_label)
transfer_from = transfer_from - amount
这没有经过测试,但应该可以。
amount = 200
transfer_from = 'wallet1'
transfer_to = 'wallet2'
obj = Wallet.objects.get(user_id=1)
transfer_from_field_val = getattr(obj,transfer_from)
transfer_to_field_val = getattr(obj,transfer_to)
transfer_from_field_val = transfer_from_field_val - amount
transfer_to_field_val = transfer_to_field_val + amount
setattr(obj , transfer_from, transfer_from_field_val)
setattr(obj , transfer_to, transfer_to_field_val)
obj.save()
setattr(obj, transfer_form, getattr(obj, transfer_form) - amount)