【问题标题】:Django: Removing items from a QuerySet without affecting added fieldsDjango:从 QuerySet 中删除项目而不影响添加的字段
【发布时间】:2014-02-19 20:30:32
【问题描述】:

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

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 中删除某些项目?

【问题讨论】:

    标签: python django pagination django-queryset


    【解决方案1】:

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

    但是,您使用 original 查询集来排除特定 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 2012-02-04
      • 2015-01-16
      • 2019-10-06
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多