Django过滤“首次”查找多对多关系

时间:2016-12-14 02:28:04

标签: python django

假设我们有两个这样的模型:

Artist(models.Model):
    name = models.CharField(max_length=50)

Track(models.Model):
    title = models.CharField(max_length=50)
    artist = models.ForeignKey(Artist, related_name='tracks')
  

如何过滤此关系以获取第一个外国记录?

所以我尝试了类似这样的东西,但它不起作用(如预期的那样)

artists = Artist.objects.filter(tracks__first__title=<some-title>)
artists = Artist.objects.filter(tracks[0]__title=<some-title>)

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:1)

这是一个没有考虑性能的解决方案。

Artist.objects.filter(tracks__in=[a.tracks.first() for a in Artist.objects.all()], tracks__title=<some_title>)

没有列表方法,按要求。

Artist.objects.filter(tracks__in=Track.objects.all().distinct('artist').order_by('artist', 'id'), tracks__title=<some_title>)

order_by&#39; id&#39;确保distinct根据插入获得第一首曲目非常重要。 order_by&#39;艺术家&#39;是排序不同查询的要求。在此处阅读:https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT