簡體   English   中英

使用 ForeignKey 的復雜 Django QuerySet 查詢

[英]A complex Django QuerySet query using ForeignKey

我正在使用 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']

我想編寫一個 function ,它將返回一個類別列表,其中 category_visible == True 以及該類別中至少一個 Feature model 實例的 feature_predictable 值是 True,並且至少有一個 Question question_visible == True。

目前,我設法創建了這樣的東西:

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)

但這可能不是最有效的方法。 怎么寫比較好? 預先感謝您的幫助。

你可以過濾

# visible question is for a predictable feature

Category.objects.filter(
    feature__feature_predictable=True,
    feature__question__question_visible=True
).distinct()

因此,我們在這里檢索具有FeatureCategory對象,其中feature_predictable=True ,並且對於這些Feature (具有feature_predictable=True ),還應該至少有一個Question具有question_visible=True

如果我們尋找一個具有可預測featureCategory和一個可見的Question ,但它本身應該是一個可預測的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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM