Sobes.tech
Middle

როდის ხდება მონაცემთა ბაზებზე მოთხოვნები queryset-ის გამოყენებისას?

sobes.tech AI

პასუხი AI-სგან

QuerySet-თან მონაცემთა ბაზის მოთხოვნები რამდენიმე ძირითადი მომენტში ხორციელდება, არა უშუალოდ QuerySet-ის შექმნის დროს. ეს დაკავშირებულია QuerySet-ის "სასურველ" ბუნებასთან.

მთავარი სცენარები მოთხოვნების შესრულებისთვის:

  • QuerySet-ის მარშრუტი: როდესაც გადიხართ QuerySet-ის ელემენტებს for ციკლში ან იყენებთ ფუნქციებს, როგორიცაა list(), tuple(), set().
  • სლაისინგი: როდესაც იყენებთ კვეცებს (queryset[start:end]) კვალდაკვალ (queryset[start:end:step]) გარეშე ნაბიჯით. მოთხოვნა შესრულდება მოთხოვნილი ობიექტების დიაპაზონის მისაღებად. ნეგატიური ნაბიჯებით ან განსხვავებული ნაბიჯით კვეცები გამოიწვევს მთლიანი QuerySet-ის მოთხოვნას, შემდეგ Python-ში დამუშავებას.
  • სერილიზაცია/სტრინგად გადაყვანა: როდესაც იძახით str(queryset) ან repr(queryset).
  • სინამდვილესობის შეფასება: როდესაც QuerySet გამოიყენება პირობით ოპერატორში (if queryset:). მოთხოვნა შესრულდება მინიმუმ ერთ ჩანაწერის არსებობის შემოწმებისთვის.
  • აგრეგატული ფუნქციების გამოყენება: როდესაც იძახით count(), sum(), avg(), max(), min() და სხვა აგრეგატული ფუნქციები.
  • მეთოდების გამოძახება, რომლებიც აბრუნებენ ერთ ობიექტს: როგორიცაა get(), first(), latest().
  • ბულიან ტიპზე გარდაქმნა: მაგალითად, if not queryset:.

მაგალითები:

# მონაცემთა ბაზას მოთხოვნა არ ხდება
queryset = MyModel.objects.filter(status='active')

# მონაცემთა ბაზაში მოთხოვნა ხდება ყველა ობიექტის მისაღებად
for obj in queryset:
    print(obj.name)

# პირველი 10 ობიექტის მისაღებად მოთხოვნა
first_ten = queryset[:10]

# ობიექტების რაოდენობის გამოთვლა
count = queryset.count()

# პირველი ობიექტის მიღება
first_obj = queryset.first()

# ობიექტების არსებობის შემოწმება
if queryset:
    print("ობიექტები მოიძებნა")

მნიშვნელოვანია, რომ Django კეშავს QuerySet-ის შედეგებს პირველი მოთხოვნის შემდეგ. შემდეგი ოპერაციები იგივე QuerySet-ზე (რომელიც უკვე შეფასებულია) გამოიყენებს კეშირებულ მონაცემებს და არ შეასრულებს ახალი მოთხოვნებს მონაცემთა ბაზაზე. თუმცა, თუ შეცვლით QuerySet-ს (მაგალითად, დაამატებთ ახალ ფილტრს), ეს შექმნის ახალ QuerySet-ს, რომელიც ჯერ არ არის შეფასებული, და შემდეგ ოპერაციაზე, რომელიც მონაცემთა წვდომას მოითხოვს, შესრულდება ახალი მოთხოვნა.