2012-07-17 13 views
6

मैं ManyToMany रिश्तोंमध्यवर्ती मॉडल (के माध्यम से कीवर्ड) (https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships)Django tastypie: मध्यवर्ती मॉडल

मैं उपयोग करने के साथ Tastypie उपयोग करने के लिए कोशिश कर रहा हूँ का उपयोग कर एक M2M संबंधों के अतिरिक्त मान रही इन मॉडलों के साथ काम:

class Point(models.Model): 
    ... 
    value = models.FloatField(_('Value'), null=True) 
    rooms = models.ManyToManyField('rooms.Room', through='points.PointPosition') 

class Room(models.Model): 
    title = models.CharField(max_length=64) 

class PointPosition(models.Model): 
    point = models.ForeignKey('points.Point', verbose_name=_('Point')) 
    room = models.ForeignKey('rooms.Room', verbose_name=_('Room')) 
    x = models.IntegerField(_('Y')) 
    y = models.IntegerField(_('X')) 

मैं कई-से-अनेक संबंध लाने के लिए कर लिया है, लेकिन नहीं अतिरिक्त क्षेत्रों । यहाँ मेरी tastypie कोड है:

class PointResource(ModelResource): 
    class Meta: 
     queryset = Point.objects.select_related(
      depth=10 
      ).prefetch_related('rooms').all() 
     resource_name = 'point' 
     allowed_methods = ['get'] 

    ... 
    value = fields.FloatField() 
    rooms = fields.ToManyField('rooms.api.RoomResource', 'rooms', full=True) 

class RoomResource(ModelResource): 
    class Meta: 
     queryset = Room.objects.all() 
     resource_name = 'room' 
     allowed_methods = ['get'] 

मैं इस तरह मेरी PointResource में हाइड्रेट कक्ष चर करने के लिए एक विधि का उपयोग करने की कोशिश कर रहा है:

def dehydrate_rooms(self, bundle):                                                       
    rooms = []                                                            
    for room in bundle.obj.rooms.all():                                                      
     position = PointPosition.objects.get(                                                    
      room_id = room.pk,                                                        
      point_id = bundle.obj.pk)                                                            
     rooms.append({'id': room.pk,                                                         
      'title': room.title,                                                       
      'x': position.x,                                                        
      'y': position.y})                                                            
    return rooms 

लेकिन समस्या यह है कि यह बनाता है मेरे पास अंक के रूप में कई क्वेरी हैं: यह वास्तविक प्रदर्शन हत्यारा है जब आपके पास +8000 अंक हैं।

मुझे प्रदर्शन प्राप्त करने के लिए कोई उपयोगी संसाधन नहीं मिला है। मैं QuerySet के लिए उपलब्ध .extra() विधि का उपयोग कर एक कस्टम क्वेरी करने के बारे में सोच रहा था, लेकिन जॉइन कीवर्ड उपलब्ध नहीं है (पैच को दो महीने पहले अस्वीकार कर दिया गया है)। और मुझे यकीन नहीं है कि चयन उपक्कर चाल चलेंगे।

उत्तर

7

क्या आपने PointPosition संसाधन का उपयोग करने के लिए अपनी क्वेरीसेट को बदलना माना है?

class PointResource(ModelResource): 
    class Meta: 
     queryset = PointPosition.objects.select_related("point", "room") 
     resource_name = 'point' 
     allowed_methods = ('get',) 

में: यह की आवाज़ क्या "प्वाइंट" अपने डेटाबेस में इसका मतलब है से वास्तव में क्या "प्वाइंट" तो वहाँ की जरूरत है कुछ अनुवाद आंतरिक विवरण को छिपाने के लिए होने के लिए अपने एपीआई में अर्थ के समान नहीं है अपने फ़िल्टरिंग पैरामीटर को समायोजित करने की आवश्यकता के खर्च, यह एक से अधिक क्वेरी करने की आवश्यकता से बच जाएगा। आपकी dehydrate विधि आवश्यकतानुसार डेटा को स्वैप कर सकती है। आप .values() का उपयोग कर कुछ ओवरहेड को भी सहेज सकते हैं ताकि केवल आवश्यक फ़ील्ड को पूर्ण ऑब्जेक्ट्स के बजाय आवश्यक फ़ील्ड खींच सकें।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। वास्तव में मैंने जो किया, लेकिन मैंने अपने डिक्शनरी को पुन: व्यवस्थित करने के लिए तत्वों को स्वैप करने के लिए 'डीहाइड्रेट' का उपयोग नहीं किया। कूल टिप :) – Solvik

+1

मैंने खुद को याद दिलाने से पहले स्वादिष्ट से लड़ने में बहुत अधिक समय बिताया कि यह सिर्फ एक साधारण डेटा संरचना का निर्माण कर रहा है और शब्दकोश बनाने के लिए एक भी सही तरीका नहीं था। मेरे पास कम से कम एक संसाधन है जहां एक ग्रेनरी ओवरराइड मॉडल रिसोर्स एक साधारण संसाधन बन गया है जो सीधे ओआरएम को जटिल डेटा संरचना को कुशलतापूर्वक बनाने के लिए कहता है। –