OneToMany Relationship for more generic django apps



我正在尝试弄清楚如何生成一对多关系船(即"一个模型到另一个模型的对象列表"(,而不必在子模型上使用外键。我想实现这一点,因为孩子应该不知道父母有一个通用的应用程序。

例:

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)

现在,我希望租约具有多次付款,但不使我的付款模型特定于我的租赁应用程序,它也应该可以在其他应用程序中使用。

这是这里的最佳实践吗?

它看起来像一般关系。参见:这里到 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)

优点:背后没有魔力,你的数据库模型很清楚。

您可以使用

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 应用程序中的默认设置。有关详细信息,请查看有关内容类型的文档页面

最新更新