Подтвердить что ты не робот

Это ошибка в PyCharm 4.0.5?

Я обновился до PyCharm 4.0.5 вчера, и с тех пор он маркировал какой-то совершенно правильный код как ошибку. В основном код просто перебирает отношения ManyToMany. Код показан ниже.

songs = []
for album in order.album_products.all():
    album_songs = Song.objects.filter(album__exact=album.album_product.id)
    if not album_songs:
        for song in album_songs:
            songs.append(song)

Линия, показывающая ошибку, следующая:

for album in order.album_products.all():

и отображается следующая ошибка:

Call 'all' directly on 'many-to-many with intermediate'. method 'all' can't be used with many-to-many relations if intermediate model is used.

Я в тупике. Этот код отлично работал в Django, насколько я помню. Я использую Django с версии 1.0 или 1.1 и всегда повторяю отношения ManyToMany, используя этот метод. Также, глядя на ответы Stackoverflow, он показывает тот же код, что и многие другие люди.

Есть ли у кого-нибудь какие-либо предложения?

4b9b3361

Ответ 1

Мне кажется ошибкой. Я не знаю, где

метод "все" не может использоваться со отношениями "многие ко многим", если используется промежуточная модель.

но я не нахожу его в документах Django. Фактически, Django docs использует его в примере в разделе "Дополнительные поля для отношений" многие ко многим":

>>> beatles.members.all()

Эта ошибка уже сообщена в PyCharm.

Ответ 2

Любопытный реальный ответ, поскольку https://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to-many-relationships показывает тот же код, что и beatles.members.all(). Но в этом случае использование intermediate model, как указано в ошибке, возможно, будет более эффективным.

Но помните, что вы делаете два запроса в альбоме album_products, так как album.album_product.id - это запрос.

   album_songs = Song.objects.filter(album__album_product=album.album_product_id)