【发布时间】:2015-06-05 08:29:23
【问题描述】:
我有以下代码:
def get_elements(self, obj):
book_elements = Element.objects.filter(book__pk=obj.id)
elements = Element.objects.filter( (Q(book__pk=obj.id) | Q(theme__pk=obj.theme_id)), ~Q(pk__in = [o.element_id for o in book_elements if o.element_id]))
serializer = GetElementSerializer(elements, context=self.context, many=True)
elements 变量是使用 Q 对象实现的查询。但是,Q(book__pk=obj.id) 和 book_elements 引用完全相同的一组值。如何在列表理解中引用 Q(book__pk=obj.id) 以避免运行 2 个查询。类似于以下内容:
def get_elements(self, obj):
elements = Element.objects.filter( (Q(book__pk=obj.id) | Q(theme__pk=obj.theme_id)), ~Q(pk__in = [o.element_id for o in Q(book__pk=obj.id) if o.element_id]))
serializer = GetElementSerializer(elements, context=self.context, many=True)
按要求我的元素模型:
class Element(models.Model):
name = models.CharField(max_length=100)
pub_date = models.DateTimeField('date published', auto_now_add=True)
mod_date = models.DateTimeField('modified date', auto_now=True)
book = models.ForeignKey(Book, blank=True, null=True, related_name='elements')
book_part = models.ForeignKey(BookPart)
theme = models.ForeignKey(Theme, blank=True, null=True, related_name='elements')
element = models.ForeignKey('self', blank=True, null=True, related_name='parent')
def __str__(self):
return self.name
感谢任何帮助!
【问题讨论】:
-
如果我正确理解了您的查询(用简单的英语),您正在做的 - 给我所有的元素,包括 book_id 或 theme_id,但不包括与 book 相关的所有元素。我说的对吗?
-
你几乎是对的。我想要的是 - 获取所有元素,包括 book_id 或 theme_id,等于本书的书籍 ID 和主题 ID,不包括与本书中的另一个元素有 FK 关系的元素。
-
你能添加你的模型吗?
-
你可以试一试吗?
elements = Element.objects.filter(Q(book_id=obj.id) | Q(theme_id=obj.theme_id)).exclude(book__elements__id=obj.element_id) -
@schillingt 我用 Element 模型代码更新了帖子
标签: django django-queryset list-comprehension django-q