2017-09-15 16 views
9

मैं django-filter का उपयोग कर django-graphene के अपने रिज़ॉल्वर में एक फ़ील्ड जोड़ना चाहता हूं। आम तौर पर मेरे संकल्प इस तरह दिखेगा:django-graphene के साथ एनोटेट करें और फ़िल्टर

my_model = DjangoFilterConnectionField(
     MyModelNode, 
     filterset_class=MyModelFilter) 

def my_resolver(self, args, context, info): 

    return MyModelFilter(
     data=format_query_args(args), 
     queryset=self).qs 

जो ठीक काम करता है।
हालांकि, मैं मॉडल फ़िल्टर को कस्टम क्वेरीसेट प्रदान करना चाहता हूं ताकि मैं फ़ील्ड पर एकत्रीकरण कर सकूं। मैं इस तरह कुछ करने के लिए कोशिश कर रहा हूँ:

def my_resolver(self, args, context, info): 
    queryset = MyModel.objects.values(
     'customer_id').annotate(
     cost_amt=Sum('cost_amt', output_field=FloatField())) 

    return MyModelFilter(
     data=format_query_args(args), 
     queryset=queryset).qs 

GraphiQL में कच्चे एसक्यूएल का निरीक्षण करने से यह सही लग रहा है। हालांकि, त्रुटि संदेश मैं GraphQL से प्राप्त

"message": "Received incompatible instance \"{'cost_amt': 260.36, 'customer_id': 300968697}\"." 

है यह सही परिणाम है, लेकिन मैं अनिश्चित हूँ क्यों GraphQL Django-ग्राफीन से इस वस्तु हो रही है। मैं एक कस्टम क्वेरीसेट कैसे प्रदान कर सकता हूं और यह काम कर सकता हूं?

उत्तर

1

ऐसा लगता है कि django-graphene मॉडल उदाहरणों के प्रश्नोत्तरी की अपेक्षा कर रहा है, जब आप QuerySet पर .values() पर कॉल करते हैं तो आप शब्दकोशों की एक क्वेरीसेट वापस प्राप्त करेंगे, इसलिए Received incompatible instance

आप subquery expressions का उपयोग करने में सक्षम हो सकते हैं, या कुछ rawsql queries कर सकते हैं जिनमें से दोनों मॉडल उदाहरण लौटाएंगे, यह वास्तव में आपके मॉडल पर आपके द्वारा सेट किए गए रिश्तों के प्रकार पर निर्भर करता है।

ऐसा लगता है कि रिश्ते के दूसरे छोर (ग्राहक पक्ष) से ​​यह एनोटेशन करना आसान हो सकता है क्योंकि आपको .values() का उपयोग करने की आवश्यकता नहीं होगी, लेकिन यह आपके लिए आवश्यक चीज़ों के लिए काम नहीं कर सकता है।

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने .raw() पर स्टैब पर लिया, लेकिन यह एक RawQuerySet और django-graphene और django-filter वास्तव में एक क्वेरीसेट चाहता है। यह बम है क्योंकि RawQuerySet में एक .all() विधि नहीं है जो django-filter परिणाम पर कॉल करने का प्रयास करता है। – duffn

1

मुझे लगता है कि आपकी समस्या तब होती है क्योंकि .values() मॉडल उदाहरण के बजाए एक शब्दकोश देता है।

आप .values() के उपयोग से बचने के लिए के रूप में आप aggregation cheat sheet के अंतिम दो उदाहरण में और Generate aggregates for each item in a QuerySet अनुभाग में देख सकते हैं की कोशिश कर सकते हैं:

def my_resolver(self, args, context, info): 
    queryset = MyModel.objects.annotate(
     cost_amt=Sum('cost_amt', output_field=FloatField())) 

return MyModelFilter(
    data=format_query_args(args), 
    queryset=queryset).qs 

लेकिन ध्यान रखें कि आप अपने समायोजित करना होगा में रखना तदनुसार "फ्रंट एंड"/रिसीवर क्योंकि अब आपका रिज़ॉल्वर एक क्वेरीसेट लौटाएगा, न कि एक शब्दकोश।

2

क्वेरीसमूह के लिए आपको मॉडल का उदाहरण प्राप्त करने की आवश्यकता काम करने के लिए जो आप

queryset = MyModel.objects.annotate(cost_amt=Sum('cost_amt', output_field=FloatField())) 

का उपयोग कर प्राप्त कर सकते हैं और फिर आप आगे क्रियाओं की कोशिश कर सकते हैं।

return MyModelFilter(data=format_query_args(args),queryset=queryset).qs 

अभी भी त्रुटि

ASSET UNION की कोशिश करो और यह है कि अगर किसी और काम करता है आप भी relay.connection से DjangoConnectionField कोशिश कर सकते हैं देखते हैं।

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