यहाँ भी एक मजेदार चाल है। एक उदाहरण के उपयोग के मामले के रूप में, यह उचित होगा यदि आपके पास मॉडल पर __unicode__
विधि है जो एक स्ट्रिंग प्रदान करता है जिसमें किसी संबंधित मॉडल से कुछ जानकारी शामिल होती है (या किसी अन्य मॉडल का मतलब लगभग हमेशा आवश्यक था)।
... और यदि आप वास्तव में निराला होना चाहते हैं, तो यहां एक और सामान्यीकृत संस्करण है। यह आपको args
या kwargs
के किसी भी संयोजन के साथ डिफ़ॉल्ट क्वेरीसेट पर विधियों के किसी अनुक्रम को कॉल करने की अनुमति देता है। कोड में कुछ त्रुटियां हो सकती हैं, लेकिन आपको विचार मिलता है।
from django.db import models
class MethodCalls(object):
"""
A mock object which logs chained method calls.
"""
def __init__(self):
self._calls = []
def __getattr__(self, name):
c = Call(self, name)
self._calls.append(c)
return c
def __iter__(self):
for c in self._calls:
yield tuple(c)
class Call(object):
"""
Used by `MethodCalls` objects internally to represent chained method calls.
"""
def __init__(self, calls_obj, method_name):
self._calls = calls_obj
self.method_name = method_name
def __call__(self, *method_args, **method_kwargs):
self.method_args = method_args
self.method_kwargs = method_kwargs
return self._calls
def __iter__(self):
yield self.method_name
yield self.method_args
yield self.method_kwargs
class DefaultQuerysetMethodCallsManager(models.Manager):
"""
A model manager class which allows specification of a sequence of
method calls to be applied by default to base querysets.
`DefaultQuerysetMethodCallsManager` instances expose a property
`default_queryset_method_calls` to which chained method calls can be
applied to indicate which methods should be called on base querysets.
"""
def __init__(self, *args, **kwargs):
self.default_queryset_method_calls = MethodCalls()
super(DefaultQuerysetMethodCallsManager, self).__init__(*args, **kwargs)
def get_queryset(self, *args, **kwargs):
qs = super(DefaultQuerysetMethodCallsManager, self).get_queryset(*args, **kwargs)
for method_name, method_args, method_kwargs in self.default_queryset_method_calls:
qs = getattr(qs, method_name)(*method_args, **method_kwargs)
return qs
class Sandwich(models.Model):
bread = models.ForeignKey(Bread)
extras = models.ManyToManyField(Extra)
# Other field definitions...
objects = DefaultQuerysetMethodCallsManager()
objects.default_queryset_method_calls.filter(
bread__type='wheat',
).select_related(
'bread',
).prefetch_related(
'extras',
)
अजगर-नकली प्रेरित MethodCalls
वस्तु एपीआई और अधिक प्राकृतिक बनाने में एक प्रयास है। कुछ शायद थोड़ा उलझन में मिल सकता है। यदि ऐसा है, तो आप __init__
arg या kwarg के लिए उस कोड को उप-आउट कर सकते हैं जो विधि कॉल जानकारी की एक विधि को स्वीकार करता है।
स्रोत
2014-01-22 18:36:33
मॉडलों का उपयोग करते समय हम यह कैसे करते हैं .QuerySet? –
मुझे लगता है कि आपको अधिक जानकारी, या कुछ उदाहरण कोड प्रदान करने की आवश्यकता है, जैसा कि आपका मतलब है; यदि आपके पास QuerySet है, तो आप सीधे 'select_related' पर कॉल कर सकते हैं। –
मेरा मतलब था कि यदि आप ऑब्जेक्ट्स का उपयोग करते हैं = MyQuerySet.as_manager() –