我已经优化了 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/