Django模型引用具有子属性的多个外键



我有以下客户详细信息模型,每个客户都有不同的支付模式(例如现金、在线转账等(:

class Customer(models.Model):
#some customer details
class Payment(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.RESTRICT, related_name='payments')
payment_mode = models.CharField(max_length=255, blank=True, null=True) 

我想添加一个新的发票模型,包括客户以及客户的付款模式。

class Invoice (models.Model):
customer = models.ForeignKey(Customer, on_delete=models.RESTRICT, related_name='payments')
payment_mode = models.ForeignKey(Customer.payments.payment_mode, on_delete=models.RESTRICT)

我将为客户创建发票,并输入客户的可用支付模式。但发票的支付模式给了我一个AttributeError:"ReverseManyToOneDescriptor"对象没有属性"payment_mode"。

我可以知道如何设置对客户子数据的引用吗?非常感谢。

您所拥有的不是有效的字段定义。

您可以直接引用Payment

payment_mode = models.ForeignKey(Payment, on_delete=models.RESTRICT)

为什么还要使用Invoice模型?现有模型中已有相同的字段。你可以简单地提出一个观点来做这件事。例如,


def show_invoice(request, pk):
# this pk value should be sent by your frontend and represents your Primary Key value for the current customer
customer = Customer.objects.get(pk=pk)
return render(request, 'some_html_page.html', {'customer': customer})

现在,在您的some_html_page.html中,您可以使用刚才传递的渲染函数({'customer': customer}(的"上下文"来显示所需的详细信息。

Django中的模型应该被认为是SQL中的表;你不应该每次都想做一个新的;推断";当你想"存储"一些东西(或规范化现有的表/模型(时,你应该制作它们。Invoice模型不做这两件事中的任何一件。

您可以通过阅读来了解如何在Django中编写视图。

如果你真的想创建发票模型,你不需要创建payment_mode字段,因为你已经指向了客户模型,而客户模型又指向了付款模型。

最新更新