1

假设我有一个房产,它可以出售和/或出租(每个都有相关的价格),我应该如何构建我的模型?

A:

class Property(models.Model):
    name = models.CharField()
    sale_price = models.DecimalField(max_digits=14, decimal_places=2)
    rent_price = models.DecimalField(max_digits=14, decimal_places=2)

乙:

class Property(models.Model):
    name = models.CharField()

CATEGORY_CHOICES = (
    (u'sale', u'Sale'),
    (u'rent', u'Rent'),
)

class Category(models.Model):
    property = models.ForeignKey('Property')
    name = models.CharField(max_length=25, choices=CATEGORY_CHOICES)
    price = models.DecimalField(max_digits=14, decimal_places=2)

C:

class Property(models.Model):
    name = models.CharField()

class Sale(models.Model):
    property = models.ForeignKey('Property')
    price = models.DecimalField(max_digits=14, decimal_places=2)

class Rent(models.Model):
    property = models.ForeignKey('Property')
    price = models.DecimalField(max_digits=14, decimal_places=2)

如果我想添加销售/租赁特定字段,我认为 C 会给我更大的灵活性。结构 B 似乎更适合查询,但我不确定。

假设我选择了 C,例如,如何查询正在出售的房产?

4

3 回答 3

3

如果你能过得去,A实际上是最好的。除此之外,像B这样的东西就可以了。C一点都不好。

Sale并且Rent不是对象,它们是对象的属性。将它们作为模型是可怕的设计。

于 2012-05-15T15:52:14.350 回答
0

如果你选择 C,你可以像这样查询出售的房产

properties = Property.objects.filter(sale__isnull=False)

这应该像在 Django 文档中一样工作: 跨越关系的查找

请记住,使用此模式,您可能只有一个房产有多个租金或销售价格,这可能不是您想要的。

于 2012-05-15T15:48:04.257 回答
0

更好的选择可能是使用 Django 的多表继承,它看起来像这样:

class Property (models.Model):
  name = models.CharField()

class SaleProperty (Property):
  price = models.DecimalField(max_digits=14, decimal_places=2)

class RentProperty (Property):
  price = models.DecimalField(max_digits=14, decimal_places=2)

这会导致创建三个表,但子分类模型的表不会复制来自Property. 相反,它们有一个不可见的外键,Django 使用它来处理父模型中的字段,就好像它们存在于子模型中一样。然后,您可以查询SaleProperty您何时只对具有销售价格的房产、RentProperty具有租赁价格的房产或Property两者感兴趣。

于 2018-06-22T04:41:46.170 回答