django sql加入喜欢

时间:2009-08-16 10:12:54

标签: django

我有以下模特

class Artist(models.Model):
    name = models.CharField(max_length=200, unique=True)
    photo = models.CharField(max_length=250)
    views = models.IntegerField()

    class Meta:
        verbose_name = "artist"
        ordering = ['-views']

    def __unicode__(self):
        return self.name

class Song(models.Model):
    artist = models.ForeignKey("Artist")
    name = models.CharField(max_length=250)
    lyrics = models.TextField(max_length=255)
    path = models.CharField(max_length=200)
    views = models.IntegerField()
    date = models.DateField()

    class Meta:
        verbose_name = "song"
        ordering = ['-views']

    def __unicode__(self):
        return self.name

并希望获得与该关键字匹配的所有行。 我可以在sql中执行它并返回我想要的内容。这是sql;

SELECT song.name, song.path FROM song JOIN artist on song.artist_id = artist.id WHERE artist.name LIKE %keyword% || song.name LIKE %keyword% || song.lyrics LIKE %keyword%

但无法弄清楚如何在django中做到这一点。我应该使用自定义sql吗?你们有更好的主意吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

matching_songs = Song.objects.filter(Q(name__contains=keyword) | Q(lyrics__contains=keyword) | Q(artist__name__contains=keyword))

有关详细信息,请参阅Q对象的Django docs

答案 1 :(得分:1)

经过2个小时的挖掘并问自己为什么没有得到预期的结果,我意识到__contains区分大小写,而__icontains则不是。

所以,例如,如果我们在数据库中有一个名为“torres”的人并将“Torres”提供给__contains,那么当__icontains将返回“Torres”时它将不返回任何内容。