उत्पाद के नाम को फ़िल्टर करके और डेटाबेस को केवल एक बार एक्सेस करके, दो Django मॉडल से उत्पाद और चित्र प्राप्त करें

Nov 29 2020

मेरे पास एक ईकामर्स वेबसाइट के लिए दो Django मॉडल हैं:

class Product(models.Model):
    name=models.CharField(max_length=300)
    description=models.CharField(max_length=10000)

class Thumnbnail(models.Model):
    thumnbnail=models.ImageField(null=True)
    product=models.ForeignKey(Product, related_name='related_product', on_delete=models.CASCADE)

उपयोगकर्ता कुछ कीवर्ड इनपुट करेगा, और मैं उस कीवर्ड के साथ उत्पाद नामों को फ़िल्टर करता हूं, और केवल उन उत्पादों को दिखाता हूं। हर उत्पाद के साथ, परिणाम पृष्ठ पर, मैं चाहता हूं कि तुरंत उसके सभी उत्पाद थंबनेल लोड हो जाएं और दिखाए जाएं।

मैं एक ही तरीके से एक ही विचार में और समान क्वेरी में दोनों मॉडल कैसे प्राप्त कर सकता हूं?

मुझे पता है कि मैं इसे दो अलग-अलग क्वेरी के साथ प्राप्त कर सकता हूं, एक

queryset = Product.objects.filter(name__contains="Fanta").all()
return queryset

और थंबनेल के लिए अन्य दृश्य

queryset = Product.objects.select_related('thumbnail').filter(name__contains="Fanta").all()
return queryset
# I will create another serializer to only show the thumbnails, for this specific queryset

हो सकता है कि मैंने आखिरी बार सही ढंग से नहीं लिखा हो, मैं सिर्फ छद्म कोड लिख रहा हूं, लेकिन मुझे पता है कि यह कैसे करना है।

मेरी बात यह है कि, मुझे एक ही बार में, ThumbnailViewset से अपने थंबनेल प्राप्त करने के लिए, ProductViewset में, उत्पाद के नाम और विवरण प्राप्त करने के लिए, एक बार इनपुट कीवर्ड के साथ product_names की दो बार फ़िल्टरिंग करने की आवश्यकता है।

मैं इसे कैसे टाल सकता हूं, और केवल एक बार फ़िल्टर करना है?

मुझे पता है कि कैसे .select_related () काम करता है, कि मैं एक ही डेटाबेस हिट के साथ दोनों मॉडल उत्पादों और थंबनेल के दोनों तालिकाओं को प्राप्त कर सकता हूं। लेकिन मैं उन्हें एक साथ कैसे दिखाऊं, और उन्हें एक ही क्वेरी में वापस कर दूं? यदि मैं एक ही धारावाहिक में लौटता हूं, तो उत्पाद से नाम और विवरण दोहराया जाएगा, जैसे:

fields= [ product_id, product_name, product_description, thumbnail_id, thumbnail_filepath]

इसलिए प्रत्येक थंबनेल के लिए, पूरे product_description को बार-बार दोहराया जाएगा, और जैसा कि 10.000 वर्ण हो सकते हैं, यदि कई उत्पाद पृष्ठ पर दिखाए जाते हैं, तो उस डेटा को सर्वर से क्लाइंट में स्थानांतरित करना धीमा होगा। और इसके अलावा, मुझे हर थंबनेल के लिए दोहराए गए विवरण की आवश्यकता नहीं है। लेकिन मुझे केवल एक बार, सभी उत्पाद थंबनेल के साथ, सबसे कुशल तरीके से उत्पाद विवरण कैसे मिलेगा?

जवाब

1 AlexElizard Nov 30 2020 at 14:15

Если я правильно понял вопрос, попробуйте то

# serializers.py
from rest_framework import serializers
from .models import Product


class ProductSerializer(serializers.ModelSerializer):
     thumnbnails = serializers.PrimaryKeyRelatedField(many=True, read_only=True,sourse='related_product')

     class Meta:
        model = Product
        fields = ['name', 'description', 'thumnbnails']


# views.py
...
from .serializers import ProductSerializer

....

queryset = Product.objects.filter(name__contains="Fanta").prefetch_related('related_product')
serializer = ProductSerializer(queryset, many=True)
return serializer.data

....