運用Q對象我有以下代碼:在列表理解
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)
元素變量是使用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中,但不包括與書相關的所有元素。我對麼? – karthikr 2015-03-31 20:45:30
你幾乎沒錯。我想要的是 - 將所有元素與book_id或theme_id相提並論,這些元素與本書的書籍ID和主題ID相等,不包括與本書中另一個元素具有FK關係的元素。 – Zach 2015-03-31 21:22:31
你可以添加你的模型嗎? – schillingt 2015-03-31 21:25:22