在Django中重用一组模型字段

时间:2010-10-14 14:05:50

标签: django django-models code-reuse

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

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)

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

  • 客户和供应商都应该有他们的“用户”地址,因此应该在Profile
  • 客户也有帐单邮寄地址,应该是客户

地址类似于:

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& amp;的ForeignKey的地址。客户类,或继承Profile&来自地址的客户类。

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

ForeignKey的

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

继承

  • 更容易访问字段
  • 更少的数据库连接
  • 使用Django管理员中的对象自动显示
  • 地址

你会选择哪一个?为什么?您认为其中任何一种解决方案本质上都不好吗?你看到了更好的选择吗?

1 个答案:

答案 0 :(得分:1)

我可能会采用外键方式 - 我认为它更清洁。

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

  1. 访问属于外键的对象的字段很容易 - my_customer.address.zipcode不是很难,是吗?
  2. 我怀疑你会发现加入过于昂贵,如果你这样做,你可以在拿走很多客户/供应商时一直避免加入。
  3. 如果您在__unicode__()上定义Address方法,并且只需添加address(如果这就是您所谓的ForeignKey属性),您可以随时在Django管理员的对象旁边显示地址{1}})您的管理员Customer