Django模型设计查询:使用ManyToManyField的任何替代方法

时间:2012-10-26 06:49:55

标签: django database-design model

所以我有一个django项目的以下模型结构

class RawData(models.Model):
    user = models.ForeignKey(User)
    timestamp = models.DateTimeField()
    ...
    value = models.PositiveIntegerField()

class SummarizedData(models.Model):
    SUMMARY_DURATION = (
        ('H', 'Hour'),
        ('D', 'Day'),
        ('M', 'Month'),
        ('Y', 'Year')
    )
    user = models.ForeignKey(User)
    duration = models.CharField(max_length=1, choices=SUMMARY_DURATION)
    timestamp = models.DateTimeField()      #for keeping track of which duration's data is this
    ...
    min_max_values = models.ManyToManyField(RawData)

现在我的问题与min_max_values有关。我只想要每个SummarizedData有2个RawData元组 - 一个对应于该持续时间内看到的最小RawData值,另一个对应于最大值。

然而,由于特定的RawData元组可能是多个SummarizedData条目的最小值(对于给定的hr,同一天等的ex),我通过manytomany关系将它们关联起来。但我无法弄清楚如何识别与SummarizedData相关的2个RawData值中的哪一个是最大值,哪个是min,除非我比较它们各自的值。所以到目前为止,我将使用SummarizedData中的函数,如getMaxValue和getMinValue。

我的问题是,对于这样一个特定情况,是不是可能以某种方式在SummarizedData中包含2个字段,每个字段对应一个RawData字段?也许是这样的?

min_value = models.OneToOneField(RawData)
max_value = models.OneToOneField(RawData)

或者我应该采用第一种方法?

被修改

抱歉,我应该使用ForeignKey而不是OneToOneField

min_value = models.ForeignKey(RawData)
max_value = models.ForeignKey(RawData)

1 个答案:

答案 0 :(得分:2)

由于以下原因,我认为您不应将数据存储为ManyToMany字段:

  1. 您必须编写显式函数来确定哪个值最小,哪个值最大
  2. 如果您单独存储最小值或最大值,任何聚合操作(如平均值,总和,最小值,最大值)或排序等(如果以表格格式显示)会更容易。
  3. 它将节省大量额外的计算,你需要更少的代码行来完成所需的操作,所以我建议你为min_value和max_value使用单独的ForeignKey字段

    min_value = models.ForeignKey(RawData)
    max_value = models.ForeignKey(RawData)