Django:如何同时向两个表添加数据

qnyhuwrf  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(172)

有了下面的表模型,我想同时从表单向2个表写入数据。

class Order(models.Model):
     department = models.CharField(max_length=20)
     responsible = models.CharField(max_length=20)
     month = models.DecimalField(max_digits=2, decimal_places=0, default=0)
     year = models.DecimalField(max_digits=4, decimal_places=0, default=0)
     def __str__(self):
         return str(self.department)

class Article(models.Model):
     name = models.CharField(max_length=20)
     description = models.CharField(max_length=20)
     quantity = models.DecimalField(max_digits=5, decimal_places=0, default=0)
     order_id = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="Order")
     comments = description = models.CharField(max_length=200)
     def __str__(self):
         return str(self.name)

视图现在非常简单:

def new_order(request):
    form_order = OrderForm(request.POST or None)

    order_Date = datetime.now()
    add_date_month = order_Date.strftime("%m")
    add_date_year = order_Date.strftime("%Y")

    if form_order.is_valid():
        form_order.instance.month = request.POST.get('date_month')
        form_order.instance.year = request.POST.get('date_year')
        form_order.save()
        return redirect(orders)

    context = {
        'form_order': form_order,
        'date_month': add_date_month,
        'date_year': add_date_year,
    }

    return render(request, 'supplier/new_order.html', context)

目前,代码中可能有一个错误,因为我正在尝试更改现有的更大的项目。以前,我将文章保存为单独的项目。现在我想把它们按顺序分组。
我想在用户添加第一个项目的同时创建一个新的订单。然后,用户将向该订单添加文章,数据将保存在一个表中。此外,每个项目都必须具有它被分配到的订单的ID。在后续文章的情况下,不会有问题,如何将这个ID添加到第一个添加的文章中?
我的问题是:如何一次将数据写入两个表?

vh0rcniy

vh0rcniy1#

使用基于类的视图,将它们基于一个模型,但在必要时添加与另一个模型相关的字段:

class MyForm( forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['foo', 'bar', ...]

    other_baz = forms.CharField( ... )  # for another model
    ...

在视图中,关注form_valid中的另一个模型

def form_valid( self, form):
    instance = form.save( commit = False) 
    other_instance = OtherModel.objects.get( ...)
    other_instance.baz = forms.cleaned_data['other_baz']

    with transaction.atomic():  # save both or neither
        instance.save()
        other_instance.save()

    return HttpResponseRedirect( ...)

在Create视图中,您希望为新创建的示例创建一个外键

with transaction.atomic():
    new_instance = form.save( commit = False) 
    new_instance.save()           # won't have a pk until saved
    other_instance = OtherModel()
    ...
    other_instance.fk_field = new_instance
    other_instance.save()

return HttpResponseRedirect( ...)

相关问题