2016-05-11 1 views
0

Я хочу обновить запись, но поле определяется строкой. Можно ли это сделать?Обновление запроса Django - поле определяется строкой

Это моя модель:

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

Джанго распознавать только поле, когда я пишу это:

obj.wallet1 = obj.wallet1 - amount 

но это не признать это:

transfer_from = 'wallet1' 
obj.transfer_from = obj.transfer_from - amount 

Говорят, что у объекта «Кошелек» нет атрибута «transfer_from». Спасибо.

+0

Прежде всего, кошелек1 является полем класса «Кошелек», а «кошелек» - это строка. Как вы ожидаете, что Django поймет, что по строке «wallet1» вы на самом деле ссылаетесь на кошелек 1 из Кошелька. Кроме того, очевидно, что вы получаете объект, не имеющий ошибки атрибута. Кроме того, что не так с obj.wallet1 = obj.wallet1 - amount –

+0

Вы должны использовать setattr и getattr. setattr (obj, field_obj, value) – durdenk

+0

@RajeshYogeshwar Я делаю это, потому что я получаю «кошелек1» с моего интерфейса с request.data ['transfer_from']. Поэтому я помещаю данные с переднего конца в переменную. – Krisnadi

ответ

1

Это не проверял, но должно работать.

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

getattr работает, но, к сожалению, setattr не работает. Знаете ли вы, в чем проблема? – Krisnadi

+0

Мой плохой. Это работы. Спасибо. – Krisnadi

1

На самом деле это вопрос 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 

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

  • Нет связанных вопросов^_^