使用自定义等价的django distinct查询

时间:2016-06-16 23:49:03

标签: django models

说我的模型看起来像这样:

class Alert(models.Model):
    datetime_alert = models.DateTimeField()
    alert_type = models.ForeignKey(Alert_Type, on_delete=models.CASCADE)
    dismissed = models.BooleanField(default=False)
    datetime_dismissed = models.DateTimeField(null=True)
    auid = models.CharField(max_length=64, unique=True)
    entities = models.ManyToManyField(to='Entity', through='Entity_To_Alert_Map')
    objects = Alert_Manager()

    def __eq__(self, other):
        return isinstance(other,
                          self.__class__) and self.alert_type == other.alert_type and \
               self.entities.all() == other.entities().all() and self.dismissed == other.dismissed

    def __ne__(self, other):
        return not self.__eq(other)

我想要完成的是这样说:如果被解雇的状态,警报类型和相关实体是相同的,则两个警报对象是等效的。使用这个想法,是否可以根据该标准编写查询以询问所有不同的警报?选择所有这些然后过滤它们似乎并不吸引人。

1 个答案:

答案 0 :(得分:2)

你提到了一种方法,我认为这不是很糟糕。我不知道任何可以做到这一点的Django。

但是,我想让你想一想为什么会出现这个问题?如果两个警报相等,如果消息,状态和类型相同,则可能这应该是它自己的类。我会考虑创建另一个类DistinctAlert(或更好的名称)并从Alert获得此类的外键。或者甚至更好,有一个Alert的课程,以及一个名为AlertEvent的课程(您的Alert课程。)

这会解决您的问题吗?

编辑:

实际上,有一种方法可以做到这一点。您可以合并values()distinct()。这样,您的查询将是

Alert.objects.all().values("alert_type", "dismissed", "entities").distinct()

这将返回字典。

documentation of values()

中查看更多内容