2017-01-14 2 views
0

Например, у меня есть экземпляр a1 и a2.Django обновить экземпляр, используя другой экземпляр

Я хотел бы обновить a1, чтобы он был таким же, как a2. (за исключением поля идентификатора)

Следующее то, что я придумал, не уверен, что он будет работать, и если есть лучший способ.

a2_data = model_to_dict(a2, exclude=['id']) 

A.objcects.filter(id=a1.id).update(**a2_data) 

ответ

0

Нет такой вещи, как «экземпляр a1 такой же, как a2». Они не могут быть одинаковыми, по крайней мере, они должны иметь разные идентификаторы.

Таким образом, невозможно выполнить такие обновления в запросе. Вы должны фильтровать записи, которые необходимо обновить, перебирать их и выполнять необходимые изменения.

+0

ах, да, кроме поля id, я обновил оп. – eugene

+0

@eugene, поэтому я считаю, что теперь вам очевидно, что вы не можете сделать это с помощью '' .update() '' '. –

0

Я не уверен, если это будет 100% работать, но я считаю, что это стоит попробовать:

a2 = A.objects.get(pk=a2_pk) 
a1 = A.objects.get(pk=a1_pk) 
a2.pk = a1.pk 
a2.save() # maybe force_update=True should be set here too 
1

Решения вы предложили работу:

from django.forms.models import model_to_dict 
a2_data = model_to_dict(a2, exclude=['id']) 
A.objects.filter(id=a1.id).update(**a2_data) 

Если вы хотите, чтобы избежать обновлений вы можете вместо этого сделать что-то вроде:

for key, value in a2_data.items(): 
    setattr(a1, key, value) 
a1.save() 

Однако этот метод не будет работать, если какое-либо из ваших полей ForeignKeys, тогда как первый метод правильно обрабатывает их.

+0

фактически обновление способ не работает. потому что django настаивает на получении фактического объекта для полей внешнего ключа, если вы не добавите '_id' в имя поля. – eugene