Я разочарован тем, что в Django мне часто приходится писать методы на собственном менеджере:
class EntryManager(Manager):
def filter_beatle(self, beatle):
return self.filter(headline__contains=beatle)
... и повторите почти тот же метод в другом Менеджере для обратного запроса:
class BlogManager(Manager):
def filter_beatle(self, beatle):
return self.filter(entry__headline__contains=beatle)
... и предикат на входе:
def headline_contains(self, beatle):
return self.headline.find(beatle) != -1
[Обратите внимание, что предикат Entry будет работать с объектами Entry, которые еще даже не были сохранены.]
Это похоже на нарушение СУХОГО. Есть ли способ выразить это один раз и использовать его во всех трех местах?
Я хотел бы написать что-то вроде:
q = Q(headline__contains="Lennon")
lennon_entries = Entry.objects.filter(q)
lennon_blogs = Blog.objects.filter(q.reverse(Entry))
is_lennon = entry.would_filter(q)
... где 'headline__contains = "Lennon"' выражает ровно один раз, что значит быть "записью о" Lennon "", и это можно использовать для построения обратных запросов и предиката.