Django:" distinct"非PostgreSQL数据库的替代品

时间:2016-01-17 20:07:46

标签: django database django-models distinct

考虑以下模型:

class Test(Model):
    # Some fields...

class TestExecution(Model):
    test = ForeignKey(Test)
    execution_date = DateTimeField()
    # more fields...

class Goal(Model):
    tests = ManyToManyField(Test)
    # more fields...

我希望获得每项测试的最新结果作为特定目标的一部分,因此我执行以下查询:

TestExecution.objects.filter(test__goal_id=goal_id).order_by("execution_date")

但问题是我执行了 ALL 执行,而我只想要每次测试的最新版本。

我看到distinct(*fields)方法可用于消除同一测试的重复执行,但它只适用于PostgreSQL,所以它不适合我。

有没有其他方法来过滤QuerySet,以便它只包含在所选列上不同的行?

1 个答案:

答案 0 :(得分:-1)

您可以删除重复项,而不是查询,但是像list(set(list_of_objects))(我建议先检查它是否有效),为了删除list_of_objects重复项,您需要定义对象的唯一性。 为了做到这一点,你需要使对象可以清洗。您需要定义哈希 eq 方法:

def __eq__(self, other):
    return self.execution_date==other.execution_date\
           and self.title==other.title
def __hash__(self):
    return hash(('title', self.title,
                 'execution_date', self.execution_date))

您也可以通过在查询中获取values_list来更轻松地完成此操作,但不能以干净的方式完成:

list(set(TestExecution.objects.filter(test__goal_id=goal_id)
                      .values_list("sth", flat = True)
                      .order_by("execution_date")))

如果对象不是以脏的方式移除hashable

seen_titles = set()
new_list = []
for obj in myList:
    if obj.title not in seen_titles:
        new_list.append(obj)
        seen_titles.add(obj.title)