【问题标题】:A complex Django QuerySet query using ForeignKey使用 ForeignKey 的复杂 Django QuerySet 查询
【发布时间】:2021-08-28 17:52:17
【问题描述】:

我正在使用 Django。我创建了 3 个模型:类别、特征、问题。

class Category(models.Model):
    category_name = models.CharField(max_length=300)
    category_order = IntegerRangeField(default=0, min_value=0)
    category_visible = models.BooleanField(default=True)

    def __str__(self):
        return self.category_name

    class Meta(object):
        ordering = ['category_order']

class Feature(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    feature_name = models.CharField(max_length=300)
    feature_code = models.CharField(max_length=50, unique=True)
    feature_predictable = models.BooleanField(default=False)

    def __str__(self):
        return self.feature_name

class Question(models.Model):
    feature = models.ForeignKey(Feature, on_delete=models.CASCADE, unique=True)
    question_order = IntegerRangeField(default=0, min_value=0)
    question_text = models.CharField(max_length=300)
    question_visible = models.BooleanField(default=True)

    def __str__(self):
        return self.question_text

    class Meta(object):
        ordering = ['question_order']

我想编写一个函数,它将返回一个类别列表,其中 category_visible == True 并且该类别中至少一个 Feature 模型实例的 feature_predictable 的值为 True,并且对于至少一个 Question question_visible = = 真。

目前,我设法创建了这样的东西:

category_queryset = category_queryset.filter(category_visible=True)

category_ids = []
for category in category_queryset:
    for feature in category.feature_set.all():
        if feature.feature_predictable is not True:
            continue
        for question in feature.question_set.all():
            if question.question_visible is not True:
                continue
            if category.id not in category_ids:
                category_ids.append(category.id)

return Category.objects.all().filter(id__in=category_ids)

但这可能不是最有效的方法。怎么写比较好?提前感谢您的帮助。

【问题讨论】:

    标签: python django filter model django-queryset


    【解决方案1】:

    您可以使用过滤器

    # visible question is for a predictable feature
    
    Category.objects.filter(
        feature__feature_predictable=True,
        feature__question__question_visible=True
    ).distinct()

    因此,我们在此处检索Category 对象,其中存在feature_predictable=TrueFeature,对于这些 Features(带有feature_predictable=True),还应该至少成为 一个 Questionquestion_visible=True

    如果我们寻找带有可预测的feature 和可见的QuestionCategory,但本身应该是Feature是可预测的,我们可以合作:

    # visible question is not per se for a predictable feature
    
    Category.objects.filter(
        feature__feature_predictable=True
    ).filter(
        feature__question__question_visible=True
    ).distinct()

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2011-04-15
      • 2015-10-29
      • 2019-09-02
      • 2021-05-06
      • 2011-06-08
      • 2012-10-25
      • 2021-05-13
      相关资源
      最近更新 更多