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

时间:2017-06-14 13:48:01

标签: python django django-models

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

示例:

CONFIG_DMA_ZONE_SIZE

我的另一个应用:

alloc_bootmem_pages

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

这是最好的做法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

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

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

并在leaseapp

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

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

优势:没有任何魔力,您的数据库模型很清晰。

相关问题