Django 通过 Table 字段数据自定义查询 ManyToMany

Django Query ManyToMany with Custom Through Table Field Data

一段时间以来,我一直在努力弄清楚这个问题,但很困惑。每个 ManyToMany 关系总会经历第三个 table,这并不难理解。但是,如果第三个 table 是通过 table 自定义的附加字段,您如何获取每一行的自定义字段?

这是我制作的示例 table。如何获取用户观看过的所有电影以及附加的 watched 字段和 finished 字段? 这个例子假设用户只允许看一次电影,不管他们是否看完,所以他们看过的每部电影只有 1 条记录。

class Movie(models.Model):
    title = models.CharField(max_length=191)

class User(models.Model):
    username = models.CharField(max_length=191)
    watched = models.ManyToMany(Movie, through='watch')

class Watch(models.Model):
    user = models.Foreignkey(User, on_delete=models.CASCADE)
    movie = models.Foreignkey(Movie, on_delete=models.CASCADE)
    watched = models.DateTimeField()
    finished = models.BooleanField()

我的朋友们,你的想法一分钱。

您可以使用:

from django.db.models import F

my_user.watched.annotate(
    <b>watched=F('watch__watched')</b>,
    <b>finished=F('watch__finished')</b>
)

这将 return QuerySetMovie 包含额外属性 .watched.finished.

也就是说,只访问 watch_set 可能更清晰,因此遍历 Watch 对象并访问 .movie 对象以获取有关电影的详细信息。您可以使用 .select_related(..) [Django-doc]same 数据库查询中获取有关 Movie 的信息:

for watch in my_user<b>.watch_set.select_related('movie')</b>:
    print(f'{watch.movie.title}: {watch.watched}, {watch.finished}')