2014-09-26 37 views
1

我想創建一個網站的目錄,我是新的Django。我需要的是:一個網站可以有許多支付處理器和一個支付處理器(Paypal,Payza等)可以屬於許多網站。我試圖創建一個表關係來表示這一點。我的模型是這樣的:在Django管理更新表關係

# Models.py 
class Sites(models.Model): 
    name = models.CharField(max_length=75) 
    link = models.CharField(max_length=150) 
    description = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return self.name 

class PaymentProcessors(models.Model): 
    name = models.CharField(max_length=75) 

    def __str__(self): 
     return self.name 

class Sites_PaymentProcessors(models.Model): 
    site = models.ManyToMany(Sites) 
    payment_processor = models.ManyToMany(PaymentProcessors) 

首先,我想知道我的模型是否正確。如果不是,我該如何解決?第二,我使用Django管理站點來創建站點和支付處理器,當我添加一個新的站點時,如何自動填充我的Sites_PaymentProcessors表格,其中SitesPayment_Processors之間的關係爲?。

回答

2

我會稍微改變模式以適應ManyToManyFields like this:

class Sites(models.Model): 
    name = models.CharField(max_length=75) 
    link = models.CharField(max_length=150) 
    description = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return self.name 

class PaymentProcessors(models.Model): 
    name = models.CharField(max_length=75) 
    sites = models.ManyToManyField('Sites', related_name='payment_processors') 

    def __str__(self): 
     return self.name 

現在,如果你想自定義字段或關係沿着存儲更多的信息,您可以利用的through table

例如,如果你想關聯金額限制或更多的定製:

class Sites(models.Model): 
    name = models.CharField(max_length=75) 
    link = models.CharField(max_length=150) 
    description = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return self.name 

class PaymentProcessors(models.Model): 
    name = models.CharField(max_length=75) 
    sites = models.ManyToManyField('Sites', related_name='payment_processors', through='SitePaymentProcessor') 

    def __str__(self): 
     return self.name 

from django.core.validators import MaxValueValidator 
class SitePaymentProcessor(models.Model): 
    site = models.ForeignKey('Site') 
    payment_processors = models.ForeignKey('PaymentProcessors') 
    amount_limit = models.IntegerField(default=1000, 
     validators=[ 
      MaxValueValidator(100) 
     ]) 

現在,這又是一個例子即

現在,registering the admin classes將使您能夠通過管理界面將數據填充到模型中。

要自動填充大型數據集,我會考慮使用fixtures而不是單獨填充元素。

+0

它解決了我的問題。謝謝! – 2014-09-26 05:08:37