如何使用Django ORM通过include和excluded标记过滤介质

如何使用Django ORM通过include和excluded标记过滤介质,django,django-models,Django,Django Models,我有以下型号 class Media(models.Model): name = models.CharField(max_length=255) tags = models.ManyToManyField('Tag', blank=True) class Tag(models.Model): name = models.CharField(max_length=255) class Filter(models.Model): name = models.Ch

我有以下型号

class Media(models.Model):
    name = models.CharField(max_length=255)
    tags = models.ManyToManyField('Tag', blank=True)

class Tag(models.Model):
    name = models.CharField(max_length=255)

class Filter(models.Model):
    name = models.CharField(max_length=255)
    tags_included = models.ManyToManyField('Tag', blank=True, related_name='included_tags')
    tags_excluded = models.ManyToManyField('Tag', blank=True, related_name='excluded_tags')

    def get_media(self):
        return """ return all media that has any tags_included set and remove all media that has tags_excluded set """
我正在寻找一种方法,根据必须包含和不包含的标签筛选媒体选择。所以我想它必须使用uu-in,过滤并排除一些how,但似乎无法运行任何东西


在此方面的任何帮助都将不胜感激,谢谢。

我想你就快到了。这应该起作用:

类过滤器(models.Model):
...
def get_介质(自身):
返回Media.objects.filter(
tags\uuu in=self.tags\u included.all()
).排除(
tags\uuu-in=self.tags\u-excluded.all()
)
我不确定您使用的是哪个版本的Django,但我用2.2和3.3测试了以下内容:

>>来自媒体。模型导入媒体、标记、过滤器
>>> 
>>>红色=Tag.objects.create(name='red')
>>>green=Tag.objects.create(name='green')
>>>blue=Tag.objects.create(name='blue')
>>> 
>>>purple\u media=media.objects.create(name='purple')
>>>teal\u media=media.objects.create(name='teal')
>>>brown\u media=media.objects.create(name='brown')
>>> 
>>>紫色\媒体。标签。添加(蓝色、红色)
>>>teal_媒体.标签.添加(绿色,蓝色)
>>>brown_媒体。标签。添加(绿色、红色)
>>> 
>>>def过滤器\介质(\过滤器):
...     返回Media.objects.filter(
…tags\uuuu in=\u filter.tags\u included.all()
…)。排除(
…tags\uuuu in=\u filter.tags\u excluded.all()
...     )   
... 
>>>blue\u filter=filter.objects.create(name='include blue')
>>>蓝色过滤器。包含标签。添加(蓝色)
>>>过滤介质(蓝色过滤)。值()
>>> 
>>>蓝色但不是红色过滤器=过滤器。对象。创建(name='蓝色但不是红色〕
>>>蓝色但不是红色过滤器。包含标签。添加(蓝色)
>>>蓝色但不是红色过滤器。标签被排除。添加(红色)
>>>过滤介质(蓝色但不是红色)。值()