2012-08-10 17 views
5

यदि मैं किसी संबंधित ऑब्जेक्ट में किसी फ़ील्ड पर फ़िल्टर करने का प्रयास करता हूं तो Tastypie एक त्रुटि देता है। उदाहरण के लिए,मैं संबंधित ऑब्जेक्ट में किसी फ़ील्ड पर फ़िल्टर कैसे करूं?

curl -H "Accept: application/json" \ 
    "http://localhost:8080/wordgame/api/v1/rounds/?format=json&players__username=moe" 

रिटर्न "खिलाड़ियों के क्षेत्र पर लुकअप को एक से अधिक स्तरों की गहराई की अनुमति नहीं है।" मैं निम्नलिखित कोड है, जो मैं संक्षिप्तता के लिए सरल बनाया का उपयोग कर रहा

Round.objects.all().filter(players__username=moe.username) 

: अनिवार्य रूप से, मैं Django खोल में मैं वर्तमान में क्या कर सकते हैं करने के लिए कोशिश कर रहा हूँ

# wordgame/api.py which has tastypie resources 
class RoundResource(ModelResource): 
    players = fields.ManyToManyField(UserResource, 'players',full=True) 
    . . . 

    class Meta: 
     queryset = Round.objects.all() 
     resource_name = 'rounds' 
     filtering = { 
      'players': ALL, 
     } 

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL, 
     } 

# wordgame/models.py which has Django models 
class Round(models.Model): 
    players = models.ManyToManyField(User) 
    word = models.CharField(max_length=75) 
    . . . 

मुझे लगता है कि यह सोचते हैं रहा हूँ क्योंकि UserResource फ़ील्ड 'उपयोगकर्ता नाम' पर एक फ़िल्टर को परिभाषित करता है जो इसे काम करना चाहिए लेकिन ऐसा नहीं करता है। मैंने RoundResource में फ़िल्टर में "players__username" जोड़ने का भी प्रयास किया, हालांकि यह या तो काम नहीं करता था।

मैंने basic filtering in the docs पढ़ा और गिटहब पर कोड को देखा, हालांकि इसके लिए कुछ भी प्रतीत नहीं होता है। मैंने advanced filtering documentation पर भी एक नज़र डाली और यह मेरे उपयोग के मामले में फिट नहीं लग रहा है। मैंने गिटहब पर टेस्टपी कोड को देखा है लेकिन यह समझने के लिए पर्याप्त नहीं है कि 1) मैं यह गलत कर रहा हूं, या 2) इसे काम करने के लिए ओवरराइड करना है।

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL_WITH_RELATIONS, 
     } 

कम से कम, मुझे लगता है कि यह डाल करने के लिए सही जगह है कि:

+0

मुझे लगता है कि 'ManyToManyField' एक टाइपो है; [द टेस्टपी डॉक्स] (http://django-tastypie.readthedocs.org/en/latest/fields.html) इसे 'फ़ील्ड के रूप में है। ToManyField' – supervacuo

+0

@supervacuo ManyToMany को मौजूदा संस्करण में ToManyField के उप-वर्ग के रूप में समर्थित किया गया है। आप इसे गिटहब [यहां] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768) पर पा सकते हैं। –

+0

आह, पर्याप्त मेला। – supervacuo

उत्तर

11

जाहिर है, आप विशेष रूप से सफेद सूची अपने filtering लाइन में संबंध फैले लुकअप, इस तरह की जरूरत है। relevant docs उदाहरणों पर काफी पतले हैं। एक Tastypie टिकट, हालांकि, suggests this should work

+0

धन्यवाद! RoundResource कक्षा में 'ALL'WITH_RELATIONS को' ALL 'को बदलना काम करता है। अब मैं उपयोगकर्ता नाम से राउंड फ़िल्टर कर सकता हूं। थोड़ा और डॉक्टर, या शायद एक बेहतर आंख (मेरे हिस्से पर), इस पर उठाया होगा। –

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