2013-09-05 14 views
18

असल में, मैं मॉडलसेरियलाइजर के संबंधित क्षेत्र से निष्क्रिय उपयोगकर्ताओं को फ़िल्टर करना चाहता हूं। मैं निम्नलिखित के रूप में रूप में अच्छी तरह Dynamically limiting queryset of related field की कोशिश की:djangorestframework: संबंधित क्षेत्र में फ़िल्टरिंग

class MySerializer(serializers.ModelSerializer): 
    users = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(active=True), many=True) 
    class Meta: 
    model = MyModel 
    fields = ('users',) 

इन तरीकों का न तो बस क्वेरीसमूह छानने के लिए काम किया। मैं इसे एक नेस्टेड से संबंधित सीरिएलाइज़र क्लास के लिए एक क्षेत्र के रूप में करना चाहता हूं (लेकिन इसे संबंधितफिल्ल्ड के साथ काम करने के लिए भी नहीं मिला)।

मैं नेस्टेड संबंध के लिए क्वेरीसेट कैसे फ़िल्टर करूं?

उत्तर

23

मैं भी एक बेहतर समाधान देखने के लिए उत्सुक हो जाऊंगा। मैंने ऐसा करने के लिए अपने धारावाहिक में एक कस्टम विधि का उपयोग किया है। यह थोड़ा और वर्बोज़ है लेकिन कम से कम यह स्पष्ट है। जहां एक GarageSerializer कारों की नेस्टेड संबंध फ़िल्टर हो जाएंगे

कुछ छद्म कोड:

class MyGarageSerializer(...): 
    users = serializers.SerializerMethodField('get_cars') 

    def get_cars(self, garage): 
     cars_queryset = Car.objects.all().filter(Q(garage=garage) | ...).select_related() 
     serializer = CarSerializer(instance=cars_queryset, many=True, context=self.context) 

     return serializer.data 

जाहिर क्वेरीसमूह जो कुछ के साथ आप चाहते हैं बदल दें। आपको हमेशा संदर्भ देने की आवश्यकता नहीं है (मैंने इसे नेस्टेड धारावाहिक में कुछ क्वेरी पैरामीटर पुनर्प्राप्त करने के लिए उपयोग किया है) और आपको शायद .select_related (जो एक अनुकूलन था) की आवश्यकता नहीं है।

+2

मेरे उद्देश्यों के लिए, यह अब के लिए वास्तव में एक अच्छा कामकाज है। हालांकि, आप की तरह, मैं यह देखने के लिए उत्सुक हूं कि कोई बेहतर समाधान है :) – fangsterr

+3

दुर्भाग्यवश यह विधि केवल पढ़ने-योग्य फ़ील्ड के लिए ही काम करती है। ऐसे समाधान की तलाश करना जो दोस्ताना लिखता है। – dbro

+1

@ डीब्रो - हाँ यह केवल पढ़ने के लिए है। मैंने उस परियोजना (2013) के बाद से डीआरएफ का उपयोग नहीं किया है, इसलिए मैं मदद नहीं कर सकता। आप एक नया सवाल पूछना चाह सकते हैं। –

संबंधित मुद्दे