我昨天更新到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中运行良好。我从版本1.0或1.1开始就一直在使用Django,并且总是使用这种方法迭代ManyToMany关系。另外,查看Stackoverflow答案也会显示许多其他人使用的相同代码。
有人有任何建议吗?
答案 0 :(得分:15)
对我来说似乎是个错误。我不知道在哪里
方法'所有'如果使用中间模型,则不能与多对多关系一起使用。
来自,但我没有在Django文档中找到它。事实上,Django docs在一个例子中使用它,在"Extra fields on many-to-many relationships":
部分>>> beatles.members.all()
此错误在PyCharm中为already reported。
答案 1 :(得分:1)
对于答案感到好奇,因为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)