Trước tiên, hãy để tôi nói rằng không có máy móc Django nào được đặt để công khai tạo điều kiện bạn muốn.
(Edit - thực sự kể từ Django 1,7 có: https://docs.djangoproject.com/en/1.7/howto/custom-lookups/)
Điều đó nói rằng, nếu bạn thực sự muốn thực hiện điều này, lớp con QuerySet
và ghi đè lên các phương pháp _filter_or_exclude()
. Sau đó, tạo trình quản lý tùy chỉnh chỉ trả về tùy chỉnh QuerySet
(hoặc bản vá lỗi của khỉ Django's QuerySet
, yuck). Chúng tôi làm điều này trong neo4django để tái sử dụng càng nhiều mã truy vấn ORM của Django càng tốt trong khi xây dựng các đối tượng Query
cụ thể Neo4j.
Hãy thử một cái gì đó (gần) như thế này, được điều chỉnh từ câu trả lời của Zach. Tôi đã rời lỗi thực tế xử lý đối với các phân tích cú pháp tra cứu lĩnh vực như một bài tập cho người đọc :)
class PersonQuerySet(models.query.QuerySet):
def _filter_or_exclude(self, negate, *args, **kwargs):
cust_lookups = filter(lambda s: s[0].endswith('__within5'), kwargs.items())
for lookup in cust_lookups:
kwargs.pop(lookup[0])
lookup_prefix = lookup[0].rsplit('__',1)[0]
kwargs.update({lookup_prefix + '__gte':lookup[1]-5,
lookup_prefix + '__lt':lookup[1]+5})
return super(PersonQuerySet, self)._filter_or_exclude(negate, *args, **kwargs)
class PersonManager(models.Manager):
def get_query_set(self):
return PersonQuerySet(self.model)
class Person(models.Model):
age = #...
objects = PersonManager()
Cuối cùng nhận xét - rõ ràng, nếu bạn muốn tra cứu lĩnh vực chuỗi tùy chỉnh, điều này sẽ nhận được khá nhiều lông. Ngoài ra, tôi thường viết này một chút chức năng hơn và sử dụng itertools cho hiệu suất, nhưng nghĩ rằng nó là rõ ràng hơn để bỏ nó ra. Chúc vui vẻ!
Nguồn
2011-11-26 22:38:50
Những câu trả lời này rất hữu ích cho ví dụ của anh ấy (có thể hoặc không phải là điều anh ấy chỉ muốn nói ra)… nhưng tôi rất thích nếu ai đó trả lời câu hỏi thực sự được hỏi. – royal
@royal Tôi nghĩ rằng câu trả lời của tôi bao gồm nó- Tôi đã có điều này xuất hiện trong một thư viện tôi đang làm việc. –