2013-08-25 9 views
23

मैं एक क्वेरीसमूह में प्रत्येक आइटम के लिए समुच्चय पैदा कर रहा हूँ:django-rest-framework queryset प्रतिक्रियाओं में एनोटेट डेटा कैसे जोड़ें?

def get_queryset(self): 
    from django.db.models import Count 
    queryset = Book.objects.annotate(Count('authors')) 
    return queryset 

लेकिन मैं JSON उत्तर में गिनती नहीं मिल रहा है।

अग्रिम धन्यवाद।

उत्तर

18

get_queryset से लौटाई गई क्वेरीसेट उन चीजों की सूची प्रदान करती है जो धारावाहिक के माध्यम से जाएंगी, जो नियंत्रित करती है कि वस्तुओं का प्रतिनिधित्व कैसे किया जाएगा। की तरह अपने बुक serializer में एक अतिरिक्त क्षेत्र जोड़ कर देखें,:

author_count = serializers.IntegerField(
    source='author_set.count', 
    read_only=True 
) 
6

Fiver के समाधान क्वेरीसमूह में हर उदाहरण के लिए डाटाबेस मारा इसलिए यदि आप एक बड़े क्वेरीसमूह है, उनके समाधान के प्रश्नों का एक बहुत पैदा करेगा होगा।

मैं to_representation अपनी पुस्तक serializer की ओवरराइड कर देगा, यह एनोटेशन से परिणाम पुनः उपयोग कर लेता। यह कुछ ऐसा दिखाई देगा:

class BookSerializer(serializers.ModelSerializer): 
    def to_representation(self, instance): 
     return {'id': instance.pk, 'num_authors': instance.authors__count} 

    class Meta: 
     model = Book 
+5

क्या आप समझा सकते हैं - क्यों फिवर का समाधान बहुत सारे प्रश्न उत्पन्न करेगा? मैंने सोचा कि सीरिएलाइज़र फ़ील्ड को क्वेरीसेट निष्पादित करने के बाद संसाधित किया जाएगा, जो उचित शामिल/समूहिंग करेगा? – DmitrySemenov

+0

मैंने इसे 'फ़ील्ड (स्रोत =' एनोटेटेड_फील्ड ') ' – outoftime

+1

@DmitrySemenov के साथ बनाया है, मुझे लगता है कि स्रोत तर्क एक विधि को संदर्भित नहीं करेगा। मेरे पास पहले मेरे कोड पर "स्रोत = 'author_set.count' था, लेकिन यह बहुत सारे प्रश्न उत्पन्न कर रहा था (आप इसे डीबगर से देख सकते हैं), अधिकांश प्रश्न दोहराए गए थे, और गिनती विधि कहा जाता था। – Tobias

29

स्वीकार किए गए समाधान डेटाबेस लौटाएंगे जितनी बार परिणाम लौटाए जाते हैं। प्रत्येक परिणाम के लिए, डेटाबेस को count क्वेरी बनाया जाएगा।

प्रश्न सीरिएलाइज़र को एनोटेशन जोड़ने के बारे में है, जो प्रतिक्रिया में प्रत्येक आइटम के लिए count क्वेरी करने से अधिक प्रभावी है।

उस के लिए एक समाधान:

models.py

class Author(models.Model): 
    name = models.CharField(...) 
    other_stuff = models... 
    ... 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(...) 
    publication_year = models... 
    ... 

serializers.py

class BookSerializer(serializers.ModelSerializer): 
    authors = serializer.IntegerField() 

    class Meta: 
     model = Book 
     fields = ('id', 'title', 'authors') 

views.py

class BookViewSet(viewsets.ModelViewSet): 
    queryset = Book.objects.annotate(authors=Count('author')) 
    serializer_class = BookSerializer 
    ... 

कि डेटाबेस में गिनती कर देगा स्तर, टी से परहेज o Book आइटमों में से प्रत्येक के लिए लेखक गणना प्राप्त करने के लिए डेटाबेस हिट करें।

+0

क्या आप एक बार बनाई गई BookViewSet कक्षा का उपयोग करने के बारे में विस्तृत जानकारी दे सकते हैं? मैं एक ही परिणाम प्राप्त करने की कोशिश कर रहा हूं लेकिन एक बार जब मेरे पास व्यूसेट है, तो मुझे यकीन नहीं है कि इसका उपयोग कैसे किया जाए। –

+3

यह स्वीकार्य उत्तर होना चाहिए। – jrobichaud

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