В Django, есть ли способ обновить существующую запись при создании новой с отношением FK к тому же родительскому объекту.
Для Сложно, сценарий будет:
- Родительская модель A имеет дочернюю модель B .
- Новые записи добавляются в модель B для каждого экземпляра A
- Вкл. Сохранить до добавления новой записи в B , логическое поле в предыдущей записи установлено значение
True
.
Обновление более старой записи произойдет вместе с созданием новой записи.
Если откатиться на устаревший рабочий процесс VB, будет создан набор данных для всех значений B для экземпляра (PK) A -> Sort (как * 1087). *) набор данных на ПК B -> Перейти к последней записи набора данных -> Изменить логическое значение попадания -> Добавить новую запись.
Как подойти к т его сценарий в Django?
Edit
FREIGHT TABLES:
class Freight(models.Model):
frt_doc_number = models.IntegerField(null=True, blank=True, verbose_name='Frt Doc Num')
frt_doc_type = models.CharField(max_length=2, null=True, default='RF', ...)
create_date = models.DateField(default=timezone.now, ...)
mat_group = models.ForeignKey(MaterialGroup, on_delete=models.CASCADE, ...)
RecvPlant = models.ForeignKey(Plant, related_name='receiving_plant', on_delete=models.CASCADE, ...)
DispPlant = models.ForeignKey(Plant, related_name='dispatching_plant', on_delete=models.CASCADE,...)
conversion_factor = models.DecimalField(max_digits=7, decimal_places=4, ...)
class FreightItems(models.Model):
freight_item = models.AutoField(primary_key=True, verbose_name='Line Item Number')
freight_item_header = models.ForeignKey(Freight, related_name='frt_docs', on_delete=models.CASCADE, ...)
freight_item_num = models.CharField(max_length=3, default=10, null=True, ...)
from_date = models.DateField(null=True, verbose_name='From date')
to_date = models.DateField(null=True, verbose_name='To date')
freight_rate = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True, default=0.00, ...)
frt_rate_past = models.BooleanField(default=False, verbose_name='Prev.Rate')
Logi c для создания записей
A документ фрахта (заголовок) можно создать для комбинации этих трех полей: 1. mat_group
, 2. RecvPlant
, 3. DispPlant
.
Всегда будет один документ для каждой такой комбинации (из трех полей, как указано выше). ставки добавляются в таблицу " FreightItems ", которая может время от времени меняться (обычно каждые 15 дней). Поэтому, когда добавляется новый тариф (в основном в режиме обновления конкретного документа фрахта ), последний действительный тариф должен быть сделан " недействительным ", если для логического поля frt_rate_past
установлено значение True
.
Создание (добавление) нового курса ДОЛЖНО происходить одновременно с установкой старого курса " invalid " ( логическое поле frt_rate_past
, установленное на True
), , чтобы гарантировать, что старые тарифы не будут подняты .
views.py
class FreightChangeView(UpdateView):
template_name = "freight_change.html"
model = Freight
form_class = FreightForm
success_url = reverse_lazy('freights_list')
def clean_status(self):
return self.instance.status
def get_context_data(self, **kwargs):
data = super(FreightChangeView, self).get_context_data(**kwargs)
if self.request.POST:
data['freightitems'] = UpdateFreightFormset(self.request.POST, self.request.FILES)
else:
data['freightitems'] = UpdateFreightFormset()
return data
def form_valid(self, form):
context = self.get_context_data()
freightitems = context['freightitems']
with transaction.atomic():
self.object = form.save()
if freightitems.is_valid():
self.object = form.save()
freightitems.instance = self.object
freightitems.save()
# return redirect('freights_list')
else:
context.update({'freightitems': freightitems})
return self.render_to_response(context)
return super(FreightChangeView, self).form_valid(form)