Это ошибка в 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, он показывает тот же код, что и многие другие люди.
Есть ли у кого-нибудь какие-либо предложения?
Ответы
Ответ 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)