尝试构建采购订单应用

时间:2018-08-02 17:31:53

标签: django

我一直在开发“采购订单”应用程序,但是我对如何将它们放在一起感到困惑。

我有3个型号-

class PurchaseOrder(models.Model):
    po_number = models.IntegerField(default=get_po_number, unique=True)
    po_date = models.DateField()
    invoice_number = models.ForeignKey(Invoice, on_delete=models.CASCADE)
    ....


class PurchaseOrderItem(models.Model):
    po_number_fk = models.ForeignKey(PurchaseOrder, on_delete=models.CASCADE)
    qty = models.IntegerField()
    unit = models.CharField(max_length=100, blank=True, null=True)
    description = models.CharField(max_length=255)
    unit_price = models.DecimalField(max_digits=6, decimal_places=2)
    amount = models.DecimalField(max_digits=6, decimal_places=2)


class PurchaseOrderTotal(models.Model):
    po_number_fk = models.ForeignKey(PurchaseOrder, on_delete=models.CASCADE)
    subtotal = models.DecimalField(max_digits=6, decimal_places=2)
    tax = models.DecimalField(max_digits=6, decimal_places=2, default="7.82")
    shipping = models.DecimalField(max_digits=6, decimal_places=2)
    other = models.DecimalField(max_digits=6, decimal_places=2)
    total = models.DecimalField(max_digits=6, decimal_places=2)

第一个(PurchaseOrder)保存有关采购订单本身的信息。即。发票号是什么,供应商等。 第二个(PurchaseOrderItem)列出要购买的采购订单中的项目 第三个(PurchaseOrderTotal)总计项目中的金额并加税等。(我可能不需要此模型。我可能可以将此信息放入第一个模型中?)

看起来是我在以正确的方式进行操作,还是应该删除第三个模型并将这些字段从第三个模型放到第一个模型中?如何汇总所有商品的所有价格?我确定我需要进行某种循环以总计所有价格,但是我应该在哪里做呢?在form_valid功能?还是我覆盖保存功能并在其中执行?谢谢!

1 个答案:

答案 0 :(得分:0)

我将合并模型1和3。您可以在提交表单时总计总数,然后将其保存到相同的模型中。最好尝试将所有相关的模型信息保留在同一张表中。如果您在测试后发现由于某种原因而无法正常运行,则可以随时进行更改。

有多种总计方法:

  1. 在提交表单并将其保存到数据库时在您的视图中进行操作。 对于您的情况,这是我推荐的选择,因为该数据虽然不太可能 经常更换。
  2. 请勿将总计保存在数据库中,并且 在显示该信息之前,请先汇总它们。
  3. 请勿将总计保存在数据库中,并汇总到您的 模板。

我强烈建议您不要使用第三个选项,因为您的声音听起来像是静态的,并且不需要在模板中进行处理。我添加了它以说明所有可能性。这也适用于第二个选项,尽管在这种情况下,两个选项要优于三个选项,因为它是在视图中而不是在模板中完成的,但仍然不是最佳选择,因为它不会因为一次又一次地进行该计算而无法进行。从未改变的数据。

示例:

def your_view(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = InvoiceForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            tax = form.cleaned_data.get('tax')
            sub = form.cleaned_data.get('sub_total')
            fee = form.cleaned_data.get('fee')
            form.total = tax + sub + fee
            form.save()
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = InvoiceForm()

    return render(request, 'name.html', {'form': form})