Django ModelAdmin get_object 优化

标签 django django-admin

我已经优化了 Django ModelAdmin 中的 get_queryset ListView :

  • .only('field1', 'field2',)
  • .select_lated('rel1',)

这些优化与我需要的 get_object 更改 View 不同:

  • .only('field1', 'field2', 'field3',)
  • .select_lated('rel1__rel2', 'rel3',)
  • .prefetch_lated(...)

事情是,get_queryset and get_object are coupled :

class BaseModelAdmin(...):

  ...

  def get_object(self, request, object_id, from_field=None):
      """
      Returns an instance matching the field and value provided, the primary
      key is used if no field is provided. Returns ``None`` if no match is
      found or the object_id fails validation.
      """
      queryset = self.get_queryset(request)
      model = queryset.model
      field = model._meta.pk if from_field is None else model._meta.get_field(from_field)
      try:
          object_id = field.to_python(object_id)
          return queryset.get(**{field.name: object_id})
      except (model.DoesNotExist, ValidationError, ValueError):
          return None

如何重写 get_queryset 而无需复制/粘贴上面的所有样板?

最佳答案

我想出了这个解决方案,这似乎是一个很好的妥协:

def get_queryset(self, request):
    queryset = super().get_queryset(request)
    if request.resolver_match.url_name.endswith('_change'):
        # admin change view
        queryset = queryset.only(
            'iso_code',
            *get_translation_fields('name'),
            'official_languages',
            'active',
            'currency_code',
            'currency_symbol',
        )
    else:
        # admin change list
        queryset = queryset.only(
            'iso_code',
            'name',
            'active',
        )
    return queryset

关于Django ModelAdmin get_object 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359042/

相关文章:

python - 将域名连接到 django web 服务器

django - 消息 - 找不到已安装的 python-django 或 python3-django 版本

django - manage.py - 不在项目文件夹中?

Django 管理员,没有 "model"的部分?

python - 从 Python 代码发送 Apple 的推送通知

python - 没有这样的列 : django_content_type. 名称

django - 重写 Django admin 的 AdminSite 类的索引 View ?

mysql - 由于 BINLOG_FORMAT = STATEMENT,使用语句格式写入二进制日志的不安全语句。

python - Django 模型过滤并按特定列区分

regex - Django urls 查询字符串的正则表达式