2017-06-14 62 views
3

我想弄清楚如何genereate一對多關係船(即「一個模型的對象列表到另一個),而無需使用外鍵。子模型我要實現這一點,因爲孩子應該不知道父母有一個通用的應用程序OneToMany關係爲更通用的Django應用程序

例:

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) 

ñ我希望租賃有多次付款,但是沒有將我的付款模式特定於我的租賃應用程序,它也應該可用於其他應用程序。

這裏是最佳做法嗎?

+0

您必須使用外鍵或一對一關係才能在兩個模型之間進行連接。 –

回答

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) 

優勢:背後有沒有魔法,你的數據庫模型是明確的。

0

您可以使用GenericForeignKey來實現此目的。要執行此操作,您需要付款模式中的content_type,object_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