Peewee 多对多关系中间表的额外字段

3

我正在尝试在Peewee 3.2.2中通过一个带有额外列的中介表来建立多对多关系,如下所示:

ThroughDeferred = DeferredThroughModel()

class Playlist(BaseModel):
    ...
    movies = ManyToManyField(Movie, backref='playlists', through_model=ThroughDeferred)

class Movie(BaseModel):
    name = CharField(max_length=100)

class PlaylistMovie(BaseModel):
    playlist = ForeignKeyField(column_name='playlist_id', field='id', model=Playlist)
    movie = ForeignKeyField(column_name='movie_id', field='id', model=Movie)
    position = PositiveSmallIntegerField(default=1)

    class Meta:
        table_name = 'playlist_movie_relation'

ThroughDeferred.set_model(PlaylistMovie)

然而,当我查询时,我只得到了相关电影数据的列表,但没有位置信息。

list(playlist.movies.dicts()) 
> [{name: 'blah', id: 3}, ...]

我该如何获取playlist.movies中的位置数据?
1个回答

1
这应该可以工作:

query = (Movie
         .select(Movie, PlaylistMovie.position)
         .join(PlaylistMovie)
         .where(PlaylistMovie.playlist == playlist)
         .order_by(PlaylistMovie.position))

for movie in query:
    print(movie.name, movie.playlistmovie.position)

只要有额外的字段,中间表最好通过显式连接而不是通过through_model声明来使用,对吧?顺便说一下,感谢你在peewee上做出的出色工作。 - altunyurt
那是我的观点,当然了。多对多字段确实最适合非常简单的关系。我个人从来不使用它。 - coleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接