我有以下三种型号:
class Category(models.Model):
name = models.CharField(max_length=120)
class Experiment(models.Model):
name = models.CharField(max_length=50, unique=True)
categories = models.ManyToManyField(Category)
class Ad(models.Model):
experiment = models.ForeignKey(Experiment, related_name='ads', on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.PROTECT, blank=True, null=True)
我想创建一个查询集,它返回ad.category在ad.experiment.categories中的所有广告。
通过的一些示例数据:类别:['Cat1','Cat2','Cat3',Cat4','Cat5']
实验:[['Exp1',['Cat2','Cat3]],['Exp2',['Cat5','Cat1']]]
广告:[['Exp1','Cat4'],['Exp1','Cat2']]
我希望创建的查询集只会返回第二个广告,因为广告的类别位于广告实验的类别中。
任何帮助,将不胜感激!
您需要遍历实验的反向关系,然后使用F
对象访问查询中的ad
的category
字段。使用distinct是因为实验将有许多类别,因此一个广告可能在比较中有多个匹配。
from django.db.models import F
Ad.objects.filter(experiment__category=F('category')).distinct()