我有一个应用程序,可以跟踪陷阱中收集的昆虫。现场代理将定期读取读数,以便我们可以准确计算所有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
。这样,管理员可以定义被跟踪的害虫,而现场代理可以只输入数字。
但是如果我改变这种关系,我不确定有害生物的数量是多少。因为读数不能用于任何害虫,它只能用于与其陷阱相关的害虫。
这有意义吗?
编辑:我认为这是一个愚蠢的想法。架构是正确的。我将在表格中添加一些前端填充预先填充的害虫。答案 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。
或者您是否想要出于其他原因更改数据库架构?