考虑以下模型:
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,以便它只包含在所选列上不同的行?
答案 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)