invokespecial
используется для реализации любой из трех вещей
private
super. …
Хотя 1. здесь не применяется (поскольку имя целевого метода не
), в любом из других случаев требуется, чтобы тип получателя был текущего класса или его подкласса. Таким образом, даже когда класс объявления метода равен Type
, ожидается, что фактический тип получателя будет назначаться текущему классу, Type$ClassType
.
Ближайшим эквивалентом того, что вы создали со своим изменением, является вызов super
, хотя в исходном коде Java вызов метода через super
заставляет ссылку на приемник быть такой же, как this
, что присваивается текущему классу.
На уровне байт-кода правила менее ограничительны, тем не менее, вызов метода, позволяющий обходить объявления методов в вашем текущем классе или его подклассах, не разрешается вызывать для ссылки на тип, которая может указывать на экземпляр полностью несвязанная иерархия подклассов, то есть Type
не является Type$ClassType
.
Соответствующее правило JVMS уже упоминалось в ответе Апангина .
Существует объектов Q
, которые позволяют выполнять сложные поиски. Пример:
from django.db.models import Q
Item.objects.filter(Q(creator=owner) | Q(moderated=False))
Вы можете использовать | оператор для непосредственного объединения наборов запросов без необходимости использования объектов Q:
result = Item.objects.filter(item.creator = owner) | Item.objects.filter(item.moderated = False)
(edit - я изначально был не уверен, вызвал ли это дополнительный запрос, но @spookylukey указал, что ленивая оценка набора запросов позаботится об этом)