Django:从QuerySet中删除项目而不影响添加的字段

时间:2014-02-19 12:08:03

标签: python django pagination django-queryset

我有一个视图处理程序,我需要在其中获取特定查询的结果页面。但是,在获取结果后,我想向对象添加一个字段,并根据该字段的内容删除某些对象。像这样:

objResultSet = MyModel.objects.filter(some_filter_conditions)

lstToRemove = []
for objResult in objResultSet:
    objResult.extra_field = get_extra_field_contents(objResult)
    if should_remove_because_of_field(objResult.extra_field):
        lstToRemove.append(objResult.id)

objResultSet = objResultSet.exclude(id__in=lstToRemove)
objPage = get_page(objResultSet, RESULTS_PER_PAGE, iPageNum)
objResultSet = objPage.object_list

for objResult in objResultSet:
    do_something_with_extra_field(objResult.extra_field)

似乎我排除了我选择的ID的行剥离了我添加的额外字段,好像这些结果直接来自数据库。有没有办法我可以保留这些额外的字段,我仍然从QuerySet中删除某些项目?

1 个答案:

答案 0 :(得分:0)

Querysets are lazy,在objResultSet上进行迭代时,您正在评估查询集并通过创建MyModel实例来迭代结果。您正在为这些模型实例添加额外的字段。

但是,您使用原始查询集来排除特定ID,从而导致对查询集进行新评估,从而创建没有额外字段的新模型实例。

尝试使用额外字段创建模型实例列表并使用这些字段而不是重用查询集。像这样:

objResultSet = MyModel.objects.filter(some_filter_conditions)

extra_fields_models = []
for objResult in objResultSet:
    objResult.extra_field = get_extra_field_contents(objResult)
    if not should_remove_because_of_field(objResult.extra_field):
        extra_fields_models.append(objResult)

objPage = get_page(extra_fields_models, RESULTS_PER_PAGE, iPageNum)
for objResult in extra_fields_models:
    do_something_with_extra_field(objResult.extra_field)