我试图弄清楚如何创建一对多关系(即一个模型的对象列表到另一个模型),而不必在孩子身上使用外键模型。我想实现这个目标,因为孩子应该不知道父母有一个通用的应用程序。
示例:
CONFIG_DMA_ZONE_SIZE
我的另一个应用:
alloc_bootmem_pages
现在我希望租约有多笔付款,但是如果我的付款模式不是特定于我的租赁应用程序,它也应该可以在其他应用程序中使用。
这是最好的做法吗?
答案 0 :(得分:0)
您可以使用GenericForeignKey
来实现此目的。为此,您需要付款模式上的content_type
,object_id
和content_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)
优势:没有任何魔力,您的数据库模型很清晰。