Python OneToMany关系适用于更通用的django应用程序

Python OneToMany关系适用于更通用的django应用程序,python,django,django-models,Python,Django,Django Models,我试图弄清楚如何生成一对多关系(即“一个模型到另一个模型的对象列表”),而不必在子模型上使用外键。我想实现这一点,因为子模型应该不知道父模型有一个通用应用程序 例如: class Payment(models.Model): lease = models.ForeignKey('leaseapp.Lease') created_at = models.DateTimeField(auto_now_add=True) amount = models.IntegerField

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

例如:

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)
现在,我希望租赁可以进行多次付款,但不需要将我的付款模式特定于我的租赁应用程序,它也可以在其他应用程序中使用


Was是这里的最佳实践?

您可以使用
通用外键
来实现这一点。为此,您需要支付模型上的
内容类型
对象id
内容对象
属性

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()
然后,您可以创建这样的租赁付款。这适用于任何模型。因此,如果您创建
费用
模型,您也可以为该模型创建付款

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

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

注释:这需要安装<代码> Django.Curib.CordyType ,这在大多数Django应用程序中是默认的。对于更多信息

它看起来像泛型关系。参见: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)

优点:背后没有魔法,数据库模型清晰。

必须使用外键或一对一关系来连接两个模型。