Django应用程序的一对多关系

2024-04-19 23:48:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚如何生成一对多关系(即“一个模型到另一个模型的对象列表”),而不必在子模型上使用外键。我想实现这一点,因为孩子应该不知道家长有一个通用的应用程序。你知道吗

示例:

class Payment(models.Model):
    lease = models.ForeignKey('leaseapp.Lease')
    created_at = models.DateTimeField(auto_now_add=True)
    amount = models.IntegerField()

以及我的其他应用程序:

class Lease(models.Model):
    leaserholder = models.CharField(max_length=300)

现在我想一个租赁有多个付款,但没有使我的付款模式具体到我的租赁应用程序,它应该可以在其他应用程序以及使用。你知道吗

这里的最佳实践是什么?你知道吗


Tags: 对象模型应用程序示例列表model关系models
2条回答

您可以使用GenericForeignKey实现这一点。为此,您需要支付模型上的content_typeobject_idcontent_object属性。你知道吗

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType


class Payment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    created_at = models.DateTimeField(auto_now_add=True)
    amount = models.IntegerField()

然后你可以这样创建一个租赁付款。这适用于任何型号。因此,如果您创建一个Fee模型,您也可以为此创建支付

class Lease(models.Model):
    leaserholder = models.CharField(max_length=300)

lease = Lease.object.first()
Payment.objects.create(content_object=lease, amount=700)

注意:这需要安装django.contrib.contenttypes,这在大多数django应用程序中是默认的。更多信息check out the docs page on contenttypes

看起来像是泛型关系。参见:here到django文档。通用外键和关系有时会在以后的开发过程中引起问题,但您也可以考虑:

class Payment(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    amount = models.IntegerField()

至少

class Lease(models.Model):
    leaserholder = models.CharField(max_length=300)

class LeasePayment(models.Model):
    lease = models.ForeignKey(Lease)
    payment = models.OneToOneField(Payment)

优点:背后没有魔法,数据库模型也很清晰。你知道吗

相关问题 更多 >