我有以下客户详细信息模型,每个客户都有不同的支付模式(例如现金、在线转账等(:
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
字段,因为你已经指向了客户模型,而客户模型又指向了付款模型。