2014-09-10 2 views
0

Я был на этом в течение двух дней, и теперь я надеюсь, что кто-то может указать мне в правильном направлении. Все, что я пытаюсь сделать, это дублировать запись в таблице/модели в другую модель с зеркальными полями, по существу создавая архивированную версию. Я хочу, чтобы это произошло, когда пользователь называет представление обновления.Дубликат/Запись архива в Django в другую модель

Что я до сих пор пробовал установить pk на None, а затем попытался найти способ переместить предыдущую версию в зеркальную/архивную модель. После нескольких часов исследований я отказался от этого пути. Затем я подумал, что ответ будет лежать с приемником pre_save, но я не могу найти способ получить доступ к экземпляру модели, а затем save, что и в архивной модели.

@receiver(pre_save, sender=InstrumentAnnual) 
def archive_calc_instance(sender, instance, **kwargs): 

    stored_id = getattr(instance, 'id', None) 
    e = InstrumentAnnual.objects.filter(id = stored_id) 
    archive = InstrumentAnnualArchive(e.field_name, e.another_field_name...) 
    archive.save() 

Насколько я могу сказать, что это должно работать, однако e содержит только первое поле из модели.

Есть ли что-то, что можно сделать с помощью этого кода для достижения моей цели или есть ли способ «Django» решить эту проблему? То есть какая-то особенность официального архива?

Заранее спасибо.

+1

Существует аналогичный вопрос: http://stackoverflow.com/questions/10817422/copy-model-object-from-a-model-to-another-in-django –

+0

Спасибо Игорь, я видел этот пост вчера, но думал, что это не то, что я искал. Видимо, это было! Я разместил свой новый код ниже. – Karl

ответ

0

Вы должны использовать именованные аргументы в конструкторе, в противном случае первый аргумент будет интерпретироваться как id, так попробовать:

# omitted code 
e = InstrumentAnnual.objects.filter(id=stored_id) 
archive = InstrumentalAnnualArchive(field_name=e.field_name, another_name=e.another_field_name, …) 
archive.save() 

Но вы можете также использовать create функцию Джанго, так:

# omitted code 
e = InstrumentAnnual.objects.filter(id=stored_id) 
archive = InstrumentalAnnualArchive.objects.create(field_name=e.field_name, another_name=e.another_field_name, …) 

Этот способ управляет сохранением для вас, поэтому вам не нужно явно сохранять ваш объект.

+0

Спасибо, что ответили. Я попробовал выше, прежде чем пытаться выполнить код в своем ответе. У него по-прежнему была проблема только получить первое поле в запросе «e». – Karl

1

С помощью @ комментарий Игоря я изменен мое решение этой проблемы:

def archive_calc(self, object_id): 
    annual = InstrumentAnnual.objects.get(id = object_id) 
    annual_archive = InstrumentAnnualArchive() 

    for field in annual._meta.fields: 
     setattr(annual_archive, field.name, getattr(annual, field.name)) 
    annual_archive.pk = None 
    annual_archive.save() 

Это произошло со мной, что использование pre_save не будет работать, как он слушает/связан с моделью, а не вид, как Я изначально думал. Поэтому я разместил вышеуказанный код в своем обновленном представлении и назвал его передающим id в object_id.

Еще раз спасибо за помощь.

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