Django darslari (Mukhammad irmatov)
1.46K subscribers
64 photos
15 videos
4 files
69 links
Kanalda python, django va backendga aloqador mavzularda postlar bo’ladi.
Author: Software Engineer
Aloqa uchun: @mukhammad_irmatov

Youtube sahifa:
https://www.youtube.com/channel/UCo-bKPTGuDtjJf9JzjvtgNw/featured
Download Telegram
#Savol:
Assalomu alekum. Bir firmaga Django App qilib berayotgan edim. Oizm Junior bolganim uchun uncha yaxshi tushunmadim. Xullas dasturda bir nechta guruhlar boladi. Teamlarga Team Leaderlar javobgar boladi va ularning Teamlarida 6- tadan userlar boladi. Savolim qanday qilib Teamlar uchun User Model yasasam boladi va ularning Team memberlarini ham qoshishim kerek. Aytgancha Team Memberlarini ham oznini akkaunti boladi, buni google va stackoverflow dan ham topa olmadim. iltimos shunga yordam bersangiz yoki qayerdan bilib olishni ko'rsatib yurobsangiz! Javobingizni kutib qolaman. Javob uchun Oldindan raxmat!

#Javob
Agar teamlar hammasi alohida alohida bo'ladigan bo'lsa, ya'ni Team1, Team2, Team3 ko'rinishida bo'lsa, team uchun bitta model tayyorlab, unga userlarni many-to-many qilib bog'laysiz, user larni permission orqali nimalar qila olishini boshqarishingiz mumkin.

Taxminiy model:

class User(models.Model):
*name - CharField
*email - EmailFIeld
*user_role - choice (oddiy user, team leader)

class Team(models.Model):
*name - charField
*users = ManyToManyField(User, related_name=teams)

Har bir komandada 6 tadan user qo'shish uchun limit kiritishni save methodini override qilib amalga oshirsa ham bo'ladi.
πŸ‘20πŸ”₯1
#Savol

Assalomu aleykum, task management app qilayotgan edim. App da proyektlar, tasklar va user lar bo'ladi.
πŸ”ΉBitta projectda bir nechta foydalanuvchilar bo'lishi mumkin
πŸ”ΉBitta projectda bir nechta tasklar bo'lishi mumkin
πŸ”ΉBitta taskka faqatgina bittagina user biriktirilishi mumkin.
Userni djangoni o'zining User modelidan foydalanmoqchiman model qismida yordam kerak edi. Oldindan rahmat

#Javob
From django.contrib.auth.models import User

class Project(models.Model):
name = models.CharField(max_length=100)
users = models.ManyToManyField(User)

class Task(models.Model):
project = models.ForeignKey(Project, related_name='project_tasks')
name = models.CharField(max_length=300)
bajaruvchi = models.ForeignKey(User, related_name='tasks')

βœ… Ma'lum bir proyektda qatnashayotgan barcha user larni bilish uchun
πŸ”Έproj = Projects.objects.get(name="magazinApp")
users = proj.users.all()

βœ… Ma'lum bir projectdagi barcha tasklarni ko'rish uchun
πŸ”Έ tasks = proj.projects_tasks.all()
project_tasks kalit so'zini Task modelida project modeliga bog'lashda related_name qismida ishlatganmiz.

βœ… Ma'lum bir foydalanuvchi qatnashayotgan barcha tasklarni ko'rish uchun
πŸ”Έu = User.objects.get(username="birorusername")
u.tasks.all()
tasks kalit so'zini Task modelida bajaruvchi fieldi ichida related_name bilan kiritib ketganmiz.
πŸ‘8🀩1
#savol
Qanday qilib bazadan olingan querysetni Viewda Json formatda Response qaytarish mumkin.

#javob
Avval modeldan istalgancha queryset olinib, values orqali Response qaytarish mumkin
Misol uchun Product model bor, DB dagi barcha productlarni Json formatda jo'natish kerak

class ProductListView(APIView):

def get(self, request):
products =
Product.objects.all().values("id", "name", "price")
products_count = products.count()
return Response({"products": products, "products_count": products_count})
πŸ‘9
#savol:
djangoda deface, ddos, sql injection lardan qanday himoyalansa boladi?

#javob:
Deface - adashmasam, saytni buzib kirgandan so'ng bajariladigan amal, ya'ni asosiy sahifani o'zlari xohlashgandek o'zgartirib ketishadi, Hacked by... degandek)

SQL Injection - bu turdagi xakerlik hujumidan django shundoq ham himoyalangan. Odatda djangoda ma'lumotlar bazasiga SQL query bilan emas, django ORM bilan murojaat qilinadi. Agar dasturda to'g'ridan to'g'ri SQL query bilan murojaat qilinadigan qism bo'lmasa, Django dasturiga SQL injection bilan hujum qilib buzib bo'lmaydi.

DDOS hujumini oldini olish uchun, django uchun Django-axes, Django-defender, Django-ratelimit kabi tayyor packagelar bor. Shulardan foydalaning. Agar DRF bo'ladigan bo'lsa, yuqoridagi packagelar ham kerak emas. DRF da tayyor throttling funksiyasi bor, limitlash va cheklash uchun ishlatiladi. Bundan tashqari, quyidagicha yechimlar ham ancha samarali bo'ladi:
1) Muvaffaqiyatsiz loginlarni saqlab borib, nechtadir xato urinishdan so'ng, o'sha IP ni bloklash
2) Agar bloklashni xohlamasangiz, CAPTCHA ishlating
3) Har muvaffaqiyatsiz login qilingandan so'ng keyingi login amalini bajarish uchun, ma'lum bir vaqt belgilang. Misol uchun, 3 marta muvaffaqiyatsiz urinishdan so'ng, keyingi login qilish uchun 60 sekund kutish kerak, keyingisida 100 sekund va hokazo.

P.S. Eng asosiysi, oddiy xavfsizlik qoidalariga amal qilishni unutmang. Maxfiy parollaringizni, ma'lumotlarni ochiq fayllarda qoldirmang. Admin qismi uchun admin/123456789 kabi parollardan foydalanmang 😁.

@djangodarslari
πŸ‘18πŸ”₯1
Django darslari (Mukhammad irmatov)
#savol: Django rest frameworkda serializer yozilgan, o'sha serializerni qanday qilib filtr qilish mumkin agar u boshqa serializerga nested qilingan bo'lsa. class productSerializer(ModelSerialzier): * guid = UUIDField() * name = charField() * reviews = R…
#javob

2 ta yechim bor. 1-si ReviewSerializerga to_representation orqali faqat is_hidden=False bo'lganlarni chiqarmaslik kerak.

2-yechim esa ReviewSerializerga yana bitta FilterSerializer yozish kerak, masalan

class FilterHiddenReviewListSerializer(serializers.ListSerializer):

def to_representation(self, data):
data = data.filter(is_hidden=False)
return super().to_representation(data)

Ya'ni alohida bitta FilterReviewList yozildi, u orqali reviewlarni filtrlab oldik
Endigi ish, filtrlangan serializerni Reviewserializerga ulab qo'yish kerak:

class ReviewSerializer(ModelSerializer):
* guid = UUIDField()
* author = AuthorSerializer(read_only=True)
* review = TextField()
* is_hidden = BooleanField(default=False)

class Meta:
list_serializer_class = FilterHiddenReviewListSerializer

Agar sizda bundanda optimal yechim bo'lsa izohlarda qoldirishingiz mumkin.
πŸ”₯10πŸ‘1