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

时间:2020-12-26 08:06:52

标签: django django-models

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

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' object has no attribute 'payment_mode'。

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

2 个答案:

答案 0 :(得分:0)

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

您可以直接引用Payment

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

答案 1 :(得分:0)

为什么甚至需要 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 中编写视图 this.

如果您确实想要制作 Invoice 模型,则不需要制作 payment_mode 字段,因为您已经指向 Customer 模型,而该模型又指向 Payment模型。

相关问题