Как искать все методы в проекте, которые возвращают реализацию интерфейса Collection?

Попробуйте установить запрос внутри контекста и вместо этого передать контекст в шаблон:

# views.py 

from .models import Move, Artist
from django.shortcuts import render


def cite(request):
    context = {'moves': Move.objects.all()}
    return render(request, 'main/cite.html', context)

, а затем в вашем шаблоне та же самая разметка должна иметь желаемый результат:

{% extends 'main/header.html' %}


{% block content %}

    <body>

      {% for mov in moves %}
        <p>{{mov.move_artist}}</p>
      {% endfor %}

    </body>

{% endblock %}

Я думаю, что ошибка возникает из-за того, что вы передали словарь непосредственно в шаблон, поэтому он появился как объект TypeError: объект Move не подходит для подписки. Надеюсь, это поможет.

Попробуйте:

from django.db import models

class Move(models.Model):
    move_artist = models.ForeignKey('Artist', on_delete=models.CASCADE) # delete default

class Artist(models.Model):
    artist_move = models.ForeignKey(Move, on_delete=models.CASCADE) # delete default

Запустите миграцию и попробуйте снова. * Возможно, вам придется удалить старые миграции.

7
задан Boris Pavlović 13 April 2009 в 15:00
поделиться

8 ответов

Обнаружено в справке Eclipse:

Чтобы найти методы с определенным типом возвращаемого значения, используйте " * "следующим образом:

  1. Откройте диалоговое окно поиска и нажмите вкладка Поиск Java.
  2. Введите '*' и тип возврата, разделенный пробел, в строке поиска.
  3. Выберите флажок с учетом регистра.
  4. Выбрать Метод и объявления, а затем щелкните Поиск.

Это может помочь найти все методы, которые возвращают определенные типы, но не реализации некоторого интерфейса.

10
ответ дан 6 December 2019 в 08:45
поделиться

Спасибо за упоминание SemmleCode. Чтобы найти все методы в источнике, которые возвращают подтип java.util.Collection, вы пишете:

import default

class CollectionType extends RefType {
  CollectionType() {
    this.getASupertype*().hasQualifiedName("java.util","Collection")
  }
}

from Method m
where m.getType() instanceof CollectionType
      and
      m.fromSource()
select m

То есть сначала мы определяем, что мы подразумеваем под CollectionType: все типы, у которых java.util.Collection является супертипом. За getASupertype стоит звезда, потому что мы хотим применить эту операцию ноль или более раз. Далее мы просто выбираем те методы, чей тип возвращаемого значения такой как CollectionType и который встречается в источнике.

Продолжайте, попробуйте :-) Это простое упражнение для дальнейшего уточнения запроса к тем методам, которые должны возвращать CollectionType, но может возвращать ноль. Все это может быть сделано в интерактивном режиме, с автозаполнением при разработке запроса и непрерывной проверкой, чтобы помочь вам сделать это правильно. [раскрытие: я генеральный директор Semmle]

5
ответ дан 6 December 2019 в 08:45
поделиться

Если нет никакого способа сделать это с существующим пользовательским интерфейсом, можно всегда использовать отражение для обхода через код. Это не так много работы, несколько вложенных циклов.

0
ответ дан 6 December 2019 в 08:45
поделиться

Я не знаю о способе найти все методы, тип возврата которых является любой произвольной реализацией java.util. Набор (включая можно определить себя).

Если можно принять решения, которые немного более ограничены, то несколько возможностей приходят на ум:

  1. Перейдите к любому классу, который импортирует java.util. Набор, дважды щелкните на "Collection", щелкните правой кнопкой по "Collection" и избранным "Ссылкам> Проект".

  2. Аналогично для какого-то конкретного типа набора интереса.

  3. Перейдите к любому методу, возвратив тип набора, дважды щелкните по его типу возврата и поиску того типа как выше.

  4. Перейдите к любому классу, который импортирует любой java.util.anything, перетащите через "java.util". исключение класса после того префикса пакета и поиска щелчка правой кнопкой ссылок проекта как выше.

Для всего вышеупомянутого представление "Search" покажет Вам расширяемую схему мест в проекте, где выбранный пункт происходит. Можно пересечь, та схема (использующий или клавиатуру - с входят в выбор - или мышь - нажимающий для выбора) исследовать места то использование. Я не вижу способ ограничить просматриваемые ссылки на "тип возврата метода", но по крайней мере Вы сможете переместиться быстро в соответствующие места в коде к глазному яблоку для определенного типа использования интереса.

(Со всеми они можно нажать на небольшой указывающий вниз треугольник в вершине вкладки "Search" и фильтра на типе использования, которое будет включено в дисплей, такой как, исключая операторов импорта.)

1
ответ дан 6 December 2019 в 08:45
поделиться

ИДЕЯ intellij имеет структурные / основанные на выражении поиски, таким образом, путем поиска всех методов, которые возвращают Набор, можно, по крайней мере, получить что-то близко.

0
ответ дан 6 December 2019 в 08:45
поделиться

PMD может проверить это, как и SemmleCode, если ваша IDE не поддерживает структурный поиск.

0
ответ дан 6 December 2019 в 08:45
поделиться

Сменное время! Я сделал на скорую руку что-то, что делает большую часть работы...

Захват

http://javadude.com/misc/collectionmarker.zip

http://javadude.com/misc/collectionmarker-source.zip (если заинтересовано)

Разархивируйте collectionmarker.zip в свой dir затмения (Ваш dir затмения должен содержать dir плагинов),

Затмение перезапуска

Будет два небольших значка затмения на панели инструментов - каждый очищает маркеры, каждый добавляет их.

Этот плагин ищет все в Вашей рабочей области; это игнорирует выборы. (Это быстро n грязный),

Надеюсь, это поможет! - Scott

1
ответ дан 6 December 2019 в 08:45
поделиться

В IntelliJ IDEA вызовите структурный поиск, выберите существующий шаблон «методы класса». Действие добавит следующий шаблон:

class $Class$ { 
  $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
}

Установите текстовое ограничение для переменной «ReturnType» (действие «Изменить переменные») на java.util.Collection, укажите «Применить ограничение в иерархии» для поиска потомков. Для переменной "MethodName" укажите, что это цель поиска. Вот начни поиски, наслаждайся :)

4
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: