2014-09-26 93 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