【问题标题】:Re-using set of model fields in Django在 Django 中重用模型字段集
【发布时间】:2011-04-25 10:36:33
【问题描述】:

我的网站有两种类型的用户;客户和供应商。我最终得到了以下类结构:

class Customer(models.Model):
    # stuff specific to customers

class Supplier(models.Model):
    # stuff specific to suppliers

class Profile(models.Model):  # returned by Django's User.get_profile()
    user = models.ForeignKey(User, unique=True)
    customer = models.OneToOneField(Customer, null=True, unique=True)
    supplier = models.OneToOneField(Supplier, null=True, unique=True)

现在我需要为这些模型添加多个地址:

  • 客户和供应商都应该有他们的“用户”地址,所以应该在个人资料中
  • 客户也有帐单地址,那么应该在客户中

地址类似于:

class Address(models.Model):
    street1 = models.CharField(max_length=100)
    street2 = models.CharField(max_length=100)
    zipcode = models.CharField(max_length=16)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    country = models.CharField(max_length=100)

我可以看到两种直接的解决方案来重用地址信息:要么通过 Profile 和 Customer 类中的 ForeignKey 引用 Address,要么从 Address 继承 Profile 和 Customer 类。

我可以看到这两种方法的一些优点:

外键

  • 将地址数据很好地分组在一个字段后面,而不是“污染”模型
  • 未来没有多重继承的风险

继承

  • 更轻松地访问字段
  • 更少的数据库连接
  • 地址在 Django 的管理中自动显示在对象中

你会选择哪一个,为什么?您认为这两种解决方案本质上都是不好的吗?你有没有更好的选择?

【问题讨论】:

    标签: django django-models code-reuse


    【解决方案1】:

    我可能会使用外键方法 - 我认为它更干净。

    处理您列出的继承的“优点”:

    1. 访问属于外键对象的字段很容易 - my_customer.address.zipcode 并不太难,是吗?
    2. 我怀疑您是否会发现连接过于昂贵,如果您这样做,在获取大量客户/供应商时总是可以避免使用它们。
    3. 如果你在 Address 上定义了一个 __unicode__() 方法,你总是可以在 Django 管理的对象旁边显示地址,并且只需添加 address(如果这就是你所说的 Customer 的 ForeignKey 属性)到你的管理list_display

    【讨论】:

    • 我主要是管理方面
    • 呃,还在学习这些东西... :-) 所以:好点!在管理方面,我最关心的是对象级视图。很高兴看到地址详细信息被炸开,而不是塞进一个字符串中。我想这可以通过 InlineModelAdmin 实现,但仍然不如继承那么干净。
    • 您可以随时将地址的一部分添加为管理员中的列 - 例如。将address.zipcode 添加到管理员的list_display
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 2012-08-08
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多