Django-数据库查询-检查值列表是否是另一个列表的子集

Django-数据库查询-检查值列表是否是另一个列表的子集,django,list,subset,contains,querying,Django,List,Subset,Contains,Querying,我正在设计一个旨在教授一门语言的网站。其理念是,通过验证课程,学生可以解锁其他内容(练习、歌曲……)。正式地说,每节课都附有标签。每当学生验证课程时,他们都会验证相关的标记。每个内容都标记有与这些标记相对应的先决条件 在一个页面上,我想显示用户根据解锁的标签可以访问的所有歌曲。如果他们解锁了与歌曲相关的所有标签,他们可以查看歌曲;否则他们就不能 以下是课程(称为课程)的模型: 这是一首歌的模型: class Chanson(models.Model): titre=models.Char

我正在设计一个旨在教授一门语言的网站。其理念是,通过验证课程,学生可以解锁其他内容(练习、歌曲……)。正式地说,每节课都附有标签。每当学生验证课程时,他们都会验证相关的标记。每个内容都标记有与这些标记相对应的先决条件

在一个页面上,我想显示用户根据解锁的标签可以访问的所有歌曲。如果他们解锁了与歌曲相关的所有标签,他们可以查看歌曲;否则他们就不能

以下是课程(称为课程)的模型:

这是一首歌的模型:

class Chanson(models.Model):
    titre=models.CharField(max_length=255, unique=True)
    prerequis=models.ManyToManyField(Tag,blank=True,related_name="+")
下面是一个用户配置文件的模型,以及我找到的解决方案,可以用它来回答我的问题

class profile(models.Model):
user=models.OneToOneField(用户,on_delete=models.CASCADE,主键=True)
cours_valides=模型。多个多个字段(cours)
chanson_valides=型号。ManyToManyField(chanson)
def songs_to_do(自我):
songlist=Chanson.objects.exclude(id\uu in=self.Chanson\u valides.values\u list('id',flat=True))
outputsonglist=列表()
对于歌曲列表中的歌曲:

如果设置(song.prerequires.values_list('id',flat=True))我将执行两个查询:

获取用户不拥有的所有标记:

locked_tags = Tag.objects.exclude(cours__profil=self)
查找所有带有用户尚未解锁的标签的歌曲:

unlocked_songs = Chanson.objects.exclude(prerequis__in=locked_tags)
您的代码如下所示:

class Profil(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    cours_valides=models.ManyToManyField(Cours)
    chanson_valides=models.ManyToManyField(Chanson)

    def unlocked_songs(self):
        locked_tags = Tag.objects.exclude(cours__profil=self)
        return Chanson.objects.exclude(prerequis__in=locked_tags)
unlocked_songs = Chanson.objects.exclude(prerequis__in=locked_tags)
class Profil(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    cours_valides=models.ManyToManyField(Cours)
    chanson_valides=models.ManyToManyField(Chanson)

    def unlocked_songs(self):
        locked_tags = Tag.objects.exclude(cours__profil=self)
        return Chanson.objects.exclude(prerequis__in=locked_tags)