[英]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()
因此,我們在這里檢索具有Feature
的Category
對象,其中feature_predictable=True
,並且對於這些Feature
(具有feature_predictable=True
),還應該至少有一個Question
具有question_visible=True
。
如果我們尋找一個具有可預測feature
的Category
和一個可見的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.