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 QuerySet
个 Movie
包含额外属性 .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}')
一段时间以来,我一直在努力弄清楚这个问题,但很困惑。每个 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 QuerySet
个 Movie
包含额外属性 .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}')