在Django Admin中更新表关系

时间:2014-09-26 04:30:29

标签: python django database django-models django-admin

我试图创建一个网站目录,我是Django的新手。我需要的是:一个站点可以有许多支付处理器,一个支付处理器(Paypal,Payza等)可以属于许多站点。我试图创建一个表关系来表示这一点。我的模型是这样的:

# 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之间的关系我添加了一个新网站?

1 个答案:

答案 0 :(得分: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而不是单独填充元素。