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

问题描述 投票:1回答:1

我已经尝试了一段时间,但是很困惑。每个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()

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

django model many-to-many
1个回答
0
投票

您可以使用:

from django.db.models import F

my_user.watched.annotate(
    watched=F('watch__watched'),
    finished=F('watch__finished')
)

这将返回QuerySetMovie,其中包含.watched.finished作为额外属性。

话虽这么说,仅访问watch_set,然后遍历Watch对象并访问.movie对象以获取有关电影的详细信息,可能会更干净。您可以使用.select_related(..) [Django-doc]same数据库查询中获取有关.select_related(..)的信息:

Movie
© www.soinside.com 2019 - 2024. All rights reserved.