Django DB设计指导

时间:2014-02-04 15:36:58

标签: django django-models django-orm

我有一个应用程序,可以跟踪陷阱中收集的昆虫。现场代理将定期读取读数,以便我们可以准确计算所有pests中的所有traps。然后,我们将显示每个特定陷阱位置的数据,其中包含列中的错误和行中的日期。

看起来很简单。

models.py(简化)

class Trap(models.Model):
    name = models.CharField(max_length=128)

class Pest(models.Model):
    common_name = models.CharField(max_length=128)

class Reading(models.Model):
    trap = models.ForeignKey(Trap, related_name='readings')
    read_time = models.DateTimeField()
    pest = models.ManyToManyField(Pest, through='PestCount')

class PestCount(models.Model):
    pest = models.ForeignKey(Pest)
    reading = models.ForeignKey(Reading)
    count = models.IntegerField()

问题是,我想为每个pests而不是每个trap定义reading。这样,管理员可以定义被跟踪的害虫,而现场代理可以只输入数字。

但是如果我改变这种关系,我不确定有害生物的数量是多少。因为读数不能用于任何害虫,它只能用于与其陷阱相关的害虫。

这有意义吗?

编辑:我认为这是一个愚蠢的想法。架构是正确的。我将在表格中添加一些前端填充预先填充的害虫。

1 个答案:

答案 0 :(得分:1)

有点不清楚,您是否在询问如何获得特定陷阱中害虫的总数?即。

trap = Trap.objects.get(name="Fly Trap")
pest = Pest.objects.get(common_name="House Fly")

total_pest_count = PestCount.objects.filter(
    reading__trap=trap,
    pest=pest
).aggregate(Sum('count'))

未经测试,应该可以工作。聚合文档页面here

或者您是否想要出于其他原因更改数据库架构?