【问题标题】:How to get request in ModelResource django-import-export如何在 ModelResource django-import-export 中获取请求
【发布时间】:2018-07-28 09:44:39
【问题描述】:

如何从 django-import-export 中 ModelResource 的方法查询集中获取 request.user?

class PeopleResource(ModelResource):
    class Meta:
       model = People
       exclude = ('id','agent', 'public_id', 'active')

    def dehydrate_placeA(self, people):
        ...
        ...

    def get_queryset(self):
        query = People.objects.filter( ..... request.user )
        return query

【问题讨论】:

  • 我没用过django-import-export,但是你用过self.request吗?
  • 是的。当然,但它没有默认模型类中的“请求”。这就是为什么它抛出 AttributeError object has no attribute 'request'
  • 好吧,因为我没有使用这个库,我只能建议将断点放入get_queryset 方法并检查堆栈跟踪。在堆栈跟踪的某个地方会有一个请求,你可以看到它是如何到达ModelResource

标签: python django python-3.x django-import-export


【解决方案1】:

我正在寻找类似的东西。我希望请求对象(基于管理员中的导出请求)附加到 Resource 实例,以便我可以检查它并根据查询参数动态影响功能。如果您想根据用户动态更改它,这也将非常有用。结果很简单:

首先,继承 ModelResource 类并寻找新的 kwarg:

from import_export import resources

class RequestModelResource(resources.ModelResource):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(RequestModelResource, self).__init__(*args, **kwargs)

然后,在 import-export 中有一个相关的管理方法可以用来传递 kwargs。 See here。将此添加到继承自 import_export.admin.ImportExportModelAdmin 的 ModelAdmin:

class MyModelAdmin(ImportExportModelAdmin):
    resource_class = MyModelResource

    def get_resource_kwargs(self, request, *args, **kwargs):
        """ Passing request to resource obj to control exported fields dynamically """
        return {'request': request}

基本上就是这样。现在在继承自 RequestModelResource 的资源类中的任意位置使用请求。例如:

class MyModelResource(RequestModelResource):
    def get_export_fields(self):
        fields = super().get_fields()

        # Check self.request.user, self.request.GET, etc to impact logic
        # however you want!

        return fields

【讨论】:

    【解决方案2】:

    问题解决了。我忘记了我之前在视图中调用过people_resource.export()。现在更容易了,因为我只是在方法export() 中传递变量kwargs 并在模型PeopleResource 中覆盖def export()。所以我的解决方案就在这里。

    views.py

    def export_excel(request):    
        ...
        people_resource = PeopleResource()
        dataset = people_resource.export(agent=request.user.agent,)
        ...
    

    models.py

    class PeopleResource(ModelResource):
        class Meta:
            model = People
            exclude = ('id','agent', 'public_id', 'active')
        ...
        ...
    
        def export(self, queryset=None, *args, **kwargs):
            queryset = People.objects.filter(agent=kwargs['agent'])
            return super(PeopleResource, self).export(queryset, *args, **kwargs)
    

    【讨论】:

      【解决方案3】:

      导出自定义数据对我来说是这样的:

      from django.contrib import admin
      from import_export.admin import ExportMixin
      from import_export.resources import ModelResource
      from jobs.models import Job
      
      class JobResources(ModelResource):
          class Meta:
              model = Job
              fields = ('id', 'foo', 'bar')
      
      class JobAdmin(ExportMixin, admin.ModelAdmin):
          resource_class = JobResources
      
          fieldsets = (...)
      

      祝大家好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2020-04-22
        • 2021-11-14
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多