说我的模型看起来像这样:
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)
我想要完成的是这样说:如果被解雇的状态,警报类型和相关实体是相同的,则两个警报对象是等效的。使用这个想法,是否可以根据该标准编写查询以询问所有不同的警报?选择所有这些然后过滤它们似乎并不吸引人。
答案 0 :(得分:2)
你提到了一种方法,我认为这不是很糟糕。我不知道任何可以做到这一点的Django。
但是,我想让你想一想为什么会出现这个问题?如果两个警报相等,如果消息,状态和类型相同,则可能这应该是它自己的类。我会考虑创建另一个类DistinctAlert
(或更好的名称)并从Alert
获得此类的外键。或者甚至更好,有一个Alert
的课程,以及一个名为AlertEvent
的课程(您的Alert
课程。)
这会解决您的问题吗?
编辑:
实际上,有一种方法可以做到这一点。您可以合并values()
和distinct()
。这样,您的查询将是
Alert.objects.all().values("alert_type", "dismissed", "entities").distinct()
这将返回字典。
中查看更多内容