Как обновить существующую запись Django модели при создании новой - PullRequest
1 голос
/ 23 февраля 2020

В Django, есть ли способ обновить существующую запись при создании новой с отношением FK к тому же родительскому объекту.

Для Сложно, сценарий будет:

  1. Родительская модель A имеет дочернюю модель B .
  2. Новые записи добавляются в модель B для каждого экземпляра A
  3. Вкл. Сохранить до добавления новой записи в 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)  

1 Ответ

0 голосов
/ 24 февраля 2020

Вы не можете сделать это в одном запросе, но вы можете сделать это в транзакции .

from django.db import transaction

def viewfunc(request):
    with transaction.atomic():
        # Before the new records are added in B, a Boolean field is set to True.
        # New records are added in model B for each instance of A
...