如何创建此查询集?

问题描述 投票:1回答:1

我有以下三种型号:

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']]

我希望创建的查询集只会返回第二个广告,因为广告的类别位于广告实验的类别中。

任何帮助,将不胜感激!

django django-queryset
1个回答
0
投票

您需要遍历实验的反向关系,然后使用F对象访问查询中的adcategory字段。使用distinct是因为实验将有许多类别,因此一个广告可能在比较中有多个匹配。

from django.db.models import F
Ad.objects.filter(experiment__category=F('category')).distinct()
© www.soinside.com 2019 - 2024. All rights reserved.