[英]How to update Django model's pre-existing record during creation of a new one
在 Django 中,有沒有辦法在創建與同一父對象具有 FK 關系的新記錄的同時更新現有記錄。
具體來說,場景將是:
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
設置為True
) frt_rate_past
,以確保舊匯率不被采用。
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.