django模型查询ManyToMany字段

时间:2014-12-19 01:25:54

标签: python django

我想查询'一部影院是由哪个影院播放的?'

我有一个模型:

class Movie(models.Model):
    link = models.URLField()
    title = models.CharField(max_length=255, null=True)

class MovieTheater(models.Model):
    movietheater = models.ManyToManyField(Movie,null=True,blank=True,through="MovieShowtime")
    movie_theater = models.CharField(max_length=255, null=True)     
    city = models.CharField(max_length=255, null=True)     #east west north south

class MovieShowtime(models.Model):
    theater = models.ForeignKey( MovieTheater, null=True,blank=True,related_name = 'theater' )
    movie = models.ForeignKey( Movie, null=True,blank=True,related_name = 'movie' )
    time = models.TextField(null=True,blank=True)              

如果我使用这个shell: 我将获得所有MovieShowtime个对象

obj = Movie.objects.get(link='www.test.com') 
obj.movie.all()

MovieShowtime个对象属于许多MovieTheater 因此,当我打印出来时,它会得到很多重复的剧院_id

for i in obj.movie.all():
    print i.theater_id

69
69
78
78
78
76
76
75
83

如何才能获得69,78,76,75,83不重复,这样我才能知道这部电影是在哪个剧院中播放的 或者有一种方法我可以直接获得movie_theater名称(字段:movie_theater)而不是theatre_id ?? 喜欢:

'AMC'
'FOX'
'BLABLABLA'

我试着搞清楚一段时间,仍然不知道。 请指导我,非常感谢你。

2 个答案:

答案 0 :(得分:1)

Django提供了使用distinct()功能避免重复的功能。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

Django还提供了仅使用values()功能返回必要字段的功能。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#values

将这两者结合起来可以为您提供所需的功能。

返回不同的剧院ID ......

for i in obj.movie.all().values('theater').distinct():
    print i['theater']

返回不同的剧院名称......

for i in obj.movie.all().values('theater__movie_theater').distinct():
    print i['theater__movie_theater']

答案 1 :(得分:0)

你应该仔细阅读documentation,你的情况可能就是示例中的情况,所以你最终会得到如下查询:

mt_names = [mt.name for mt in MovieTheater.objects.filter(movietheater__link="www.test.com")]