【问题标题】:Update Table Relationship in Django Admin在 Django Admin 中更新表关系
【发布时间】:2014-11-21 00:33:41
【问题描述】:

我正在尝试创建一个站点目录,我是 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 Admin 站点来创建站点和支付处理器,当我添加新站点时,如何使用 SitesPayment_Processors 之间的关系自动填充我的 Sites_PaymentProcessors 表?

【问题讨论】:

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


    【解决方案1】:

    我会稍微改变模型以适应 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,而不是单独填充元素。

    【讨论】:

      猜你喜欢
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2019-09-16
      • 2011-01-06
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多