पर उपयोगकर्ता विशिष्ट फ़ील्ड जोड़ें, मैं एक धारावाहिक में एक फ़ील्ड जोड़ना चाहता हूं जिसमें उपयोगकर्ता को वर्तमान अनुरोध करने के लिए विशिष्ट जानकारी शामिल है (मैं इसके लिए एक अलग अंतराल बनाना नहीं चाहता)। यहाँ है जिस तरह से मैंने किया:Django REST Framework serializer
viewset:
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_class = ArticleFilterSet
def prefetch_likes(self, ids):
self.current_user_likes = dict([(like.article_id, like.pk) for like in Like.objects.filter(user=self.request.user, article_id__in=ids)])
def get_object(self, queryset=None):
article = super(ArticleViewSet, self).get_object(queryset)
self.prefetch_likes([article.pk])
return article
def paginate_queryset(self, queryset, page_size=None):
page = super(ArticleViewSet, self).paginate_queryset(queryset, page_size)
if page is None:
return None
ids = [article.pk for article in page.object_list]
self.prefetch_likes(ids)
return page
serializer:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
def to_native(self, obj):
ret = super(ArticleSerializer, self).to_native(obj)
if obj:
view = self.context['view']
ret['has_liked'] = False
if hasattr(view, 'current_user_liked'):
ret['has_liked'] = obj.pk in view.current_user_liked
return ret
वहाँ पसंद आया लेख के प्रीफेचिंग इंजेक्षन लिए एक बेहतर जगह है, या सामान्य रूप से ऐसा करने का एक अच्छा तरीका?
मैं कस्टम फ़ील्ड पसंद है, लेकिन 'user_likes_article' कैशिंग/प्रीफेचिंग के रास्ते में ज्यादा नहीं कर पा रहा हो सकता है अगर तुम सब यह एक लेख पार जाते हैं। 'Get_queryset' के अंदर प्रीफेचिंग करने का कारण यह है कि अनुरोध के लिए प्रासंगिक सभी आलेख आईडी वहां ज्ञात हैं। क्या क्वेरीसेट किसी भी तरह से धारावाहिक क्षेत्र में उपलब्ध है? –
मुझे लगता है कि आप user_likes (या ऐसे) के एक (कैश किए गए) संग्रह से आलेख चुनने के लिए एकल आलेख पैरामीटर का उपयोग करेंगे, आपकी क्वेरीसेट केवल Article.objects.all() सही है? वहाँ कुछ भी अनुरोध अनुरोध नहीं है लेकिन वास्तव में आप user_likes_article को कैसे लागू करेंगे (निश्चित रूप से) आप जो भी करने की कोशिश कर रहे हैं उस पर निर्भर करते हैं। –
मुझे एहसास हुआ कि मेरे मूल प्रश्न में एक गंभीर बग था; यह सभी सम्मान क्वेरीसेट फ़िल्टरिंग या अंकन नहीं था। मैंने इसे अभी संशोधित किया है, और मुझे लगता है कि यह थोड़ा और समझ में आता है। आप देख सकते हैं कि कैसे प्रीफेचिंग अनुरोध (फ़िल्टरिंग और पेजिनेशन) के साथ कसकर जोड़ती है और मैं इसे आसानी से पसंद मॉडल में नहीं ले जा सकता हूं। –