簡體   English   中英

如何在創建新模型期間更新 Django 模型的預先存在的記錄

[英]How to update Django model's pre-existing record during creation of a new one

在 Django 中,有沒有辦法在創建與同一父對象具有 FK 關系的新記錄的同時更新現有記錄。

具體來說,場景將是:

  1. 父模型A有一個子模型B
  2. A 的每個實例在模型B中添加新記錄
  3. 保存時,在B 中添加新記錄之前,前一個記錄中的布爾字段設置為True

舊記錄的更新將隨着新記錄的創建而發生。

如果一個人依傍傳統VB的工作流程,數據集將被用於B的所有值創建了一個實例中(PK) - >排序(ASC)對B的PK數據集- >轉到最后一個記錄數據集的 --> 更改命中的布爾值 --> 添加新記錄。

如何在 Django 中處理這種情況?

編輯

運費表:

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

創建記錄的邏輯

可以為以下三個字段的組合創建貨運單據(抬頭): 1. mat_group , 2. RecvPlant , 3. DispPlant

對於每個這樣的組合(如上所述的三個字段),總會有一個文檔。 費率會添加到“ FreightItems ”表中,該表可能會不時更改(通常每 15 天更改一次)。 因此,當添加新費率時(基本上在特定貨運單據的更新模式下),必須通過將布爾字段frt_rate_past設置為True來使最后一個有效費率“無效”。

新匯率的創建(添加)必須與將舊匯率設置為“無效”(布爾字段frt_rate_past設置為Truefrt_rate_past以確保舊匯率不被采用

視圖.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)  

你不能在一個查詢中完成,但你可以在一個事務中完成

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM