我已经尝试了一段时间,但是很困惑。每个ManyToMany
关系总是经过第三张表,这并不难理解。但是,如果第三个表是带有附加字段的自定义直通表,那么如何获取每一行的自定义字段呢?
这是我制作的样本表。如何获得用户观看过的所有电影以及附加的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(
watched=F('watch__watched'),
finished=F('watch__finished')
)
这将返回QuerySet
的Movie
,其中包含.watched
和.finished
作为额外属性。
话虽这么说,仅访问watch_set
,然后遍历Watch
对象并访问.movie
对象以获取有关电影的详细信息,可能会更干净。您可以使用.select_related(..)
[Django-doc]在same数据库查询中获取有关.select_related(..)
的信息:
Movie