मैं निम्नलिखित मॉडल:अनुकूलन डेटाबेस प्रश्नों
class User(models.Model):
name = models.Charfield()
email = models.EmailField()
class Friendship(models.Model):
from_friend = models.ForeignKey(User)
to_friend = models.ForeignKey(User)
और उन मॉडलों निम्नलिखित दृश्य में उपयोग किया जाता है और serializer:
class GetAllUsers(generics.ListAPIView):
authentication_classes = (SessionAuthentication, TokenAuthentication)
permission_classes = (permissions.IsAuthenticated,)
serializer_class = GetAllUsersSerializer
model = User
def get_queryset(self):
return User.objects.all()
class GetAllUsersSerializer(serializers.ModelSerializer):
is_friend_already = serializers.SerializerMethodField('get_is_friend_already')
class Meta:
model = User
fields = ('id', 'name', 'email', 'is_friend_already',)
def get_is_friend_already(self, obj):
request = self.context.get('request', None)
if request.user != obj and Friendship.objects.filter(from_friend = user):
return True
else:
return False
तो बुनियादी तौर पर, प्रत्येक उपयोगकर्ता के लिए GetAllUsers
व्यू द्वारा लौटाया गया, मैं यह मुद्रित करना चाहता हूं कि उपयोगकर्ता अनुरोधकर्ता के साथ एक मित्र है (वास्तव में मुझे दोनों से_ और to_friend की जांच करनी चाहिए, लेकिन इस मामले में कोई फर्क नहीं पड़ता)
मैं क्या देख डेटाबेस में एन उपयोगकर्ताओं के लिए, वहाँ serializer के get_is_friend_already
में सभी N उपयोगकर्ता प्राप्त करने के लिए 1 क्वेरी, और फिर 1xN प्रश्नों है कि एक तरह से आराम-ढांचे तरीके से इस से बचने के लिए होती है ? शायद select_related
पास करने जैसी कुछ चीज़ों में सेरिअलाइज़र को क्वेरी शामिल है जिसमें प्रासंगिक Friendship
पंक्तियां हैं?
+1 महान जवाब केविन! – Fiver
ग्रेट उत्तर केविन। बहुत बहुत धन्यवाद। केवल थोड़ी सी बात यह है कि obj.friends में दोस्त के बजाय, मुझे फोन करने की ज़रूरत है: दोस्त के लिए obj.friends.all() .. संबंधित धागा यहां है: http://stackoverflow.com/questions/6314841/ typeerror-relatedmanager-object-is-not-iterable – dowjones123
"prefetch_related" वाला पहला दृष्टिकोण बोझिल होगा यदि उपयोगकर्ता के हजारों मित्र थे। उस मामले में प्रत्येक उपयोगकर्ता – xleon