بخش های اصلی

آموزش Django

Django – مدل‌ها (Models)

مدل (Model)، کلاسیِه که یک جدول یا یک مجموعه را در پایگاه داده نمایش میده، و جاییِه که تمام خصیصه های (attribute) کلاس، فیلدی از جدول یا مجموعه هستن. مدل ها (Models) در app/models.py (در مثال زیر: myapp/models.py) ذخیره میشن.

ایجاد مدل (Model)

در ادامه یک مدلِ Dremreal را مشاهده می کنین که آن را بعنوان مثال ایجاد کرده ای:

from django.db import models

class Dreamreal(models.Model):

   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()

   class Meta:
      db_table = "dreamreal"

تمام مدل ها از django.db.models.Model ارث بری می کنن.

کلاسی که در این مثال آورده ایم، 4 خصیصه (3 CharField و 1 Integer) داره که همان فیلدهای جدول خواهند بود.

در کلاسِ  Meta، خصیصه ی db_table این امکان را به ما میده تا نامِ جدول یا مجموعه ی واقعی را تعریف کنیم. Django، نامگذاری جدول یا مجموعه را بصورت خودکار انجام میده: myapp_modelName. این کلاس این امکان را به شما میده تا کاری کنین که نام جدول حتماً بصورتی که شما دوست دارین باشه.

Django، انواعِ فیلدهای بیش تری در django.db.models داره که می توانید با مراجعه به https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types در مورد آن ها اطلاعات بیش تری کسب کنین.

بعد از ایجاد مدل، باید پایگاه داده اصلی را ایجاد کنین:

$python manage.py syncdb

تغییر داده (CRUD)

در ادامه یک View با نامِ “crudops” ایجاد می کنیم تا نحوه ی انجام عملیاتِ CRUD در مدل ها (models) را یاد بگیرین. myapp/views.py باید بصورت زیر باشه –

myapp/views.py

from myapp.models import Dreamreal
from django.http import HttpResponse

def crudops(request):
   #Creating an entry
   
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "sorex@polo.com", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   
   #Read ALL entries
   objects = Dreamreal.objects.all()
   res ='Printing all Dreamreal entries in the DB : <br>'
   
   for elt in objects:
      res += elt.name+"<br>"
   
   #Read a specific entry:
   sorex = Dreamreal.objects.get(name = "sorex")
   res += 'Printing One entry <br>'
   res += sorex.name
   
   #Delete an entry
   res += '<br> Deleting an entry <br>'
   sorex.delete()
   
   #Update
   dreamreal = Dreamreal(
      website = "www.polo.com", mail = "sorex@polo.com", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   res += 'Updating entry<br>'
   
   dreamreal = Dreamreal.objects.get(name = 'sorex')
   dreamreal.name = 'thierry'
   dreamreal.save()
   
   return HttpResponse(res)

تغییرات دیگرِ داده ها

در ادامه راجع به تغییرات دیگری که می توانید روی داده ها انجام بدین، توضیح میدیم. در نظر داشته باشین که اعمالِ CRUD در نمونه مدلی که ایجاد کردیم انجام شدن، حالا مستقیماً با کلاسی که مدل را نمایش میده، کار می کنیم.

یک view با نامِ 'datamanipulation' در myapp/views.py ایجاد کنین.

from myapp.models import Dreamreal
from django.http import HttpResponse

def datamanipulation(request):
   res = ''
   
   #Filtering data:
   qs = Dreamreal.objects.filter(name = "paul")
   res += "Found : %s results<br>"%len(qs)
   
   #Ordering results
   qs = Dreamreal.objects.order_by("name")
   
   for elt in qs:
      res += elt.name + '<br>'
   
   return HttpResponse(res)

لینک کردن مدل ها (Linking Models)

Django ORM برای لینک کردن مدل ها، سه راه پیشنهاد میده:

اولین روشی که توضیح میدیم، رابطه ی یک به چندِه. همانطور که در مثال بالا مشاهده می کنین، شرکتِ Dreamreal می تواند چندین وب سایت آنلاین داشته باشه. تعریف چنین رابطه ای با استفاده از using django.db.models.ForeignKey انجام شده –

myapp/models.py

from django.db import models

class Dreamreal(models.Model):
   website = models.CharField(max_length = 50)
   mail = models.CharField(max_length = 50)
   name = models.CharField(max_length = 50)
   phonenumber = models.IntegerField()
   online = models.ForeignKey('Online', default = 1)
   
   class Meta:
      db_table = "dreamreal"

class Online(models.Model):
      domain = models.CharField(max_length = 30)
   
   class Meta:
      db_table = "online"

همان طور که در فایلِ آپدیت شده ی updated myapp/models.py مشاهده می کنین، مدلِ آنلاین را اضافه کرده ایم و آن را به مدلِ Dreamreal لینک کرده ایم.

در ادامه بررسی می کنیم که چطور تمام این ها با پوسته ی manage.py کار می کنن –

ابتدا تعدادی شرکت (شرکت های ثبت شده ی Dreamreal) برای تست در پوسته ی Django ایجاد کنین.

$python manage.py shell

>>> from myapp.models import Dreamreal, Online
>>> dr1 = Dreamreal()
>>> dr1.website = 'company1.com'
>>> dr1.name = 'company1'
>>> dr1.mail = 'contact@company1'
>>> dr1.phonenumber = '12345'
>>> dr1.save()
>>> dr2 = Dreamreal()
>>> dr1.website = 'company2.com'
>>> dr2.website = 'company2.com'
>>> dr2.name = 'company2'
>>> dr2.mail = 'contact@company2'
>>> dr2.phonenumber = '56789'
>>> dr2.save()

حالا تعدادی دامنه ی هاست شده (hosted domains)، ایجاد کنین  -

>>> on1 = Online()
>>> on1.company = dr1
>>> on1.domain = "site1.com"
>>> on2 = Online()
>>> on2.company = dr1
>>> on2.domain = "site2.com"
>>> on3 = Online()
>>> on3.domain = "site3.com"
>>> dr2 = Dreamreal.objects.all()[2]
>>> on3.company = dr2
>>> on1.save()
>>> on2.save()
>>> on3.save()

دسترسی به خصیصه ی (attribute) شرکتِ هاستینگ (شرکت ثبت شده در Dreamreal) از یک دامنه ی آنلاین، ساده ست.

>>> on1.company.name

اگه بخواین توسط یکی از شرکت های Dreamreal از تمام دامنه های هاست شده ی آنلاین اطلاع پیدا کنین، می توانید از کد زیر استفاده کنین –

>>> dr1.online_set.all()

برای گرفتن یک QuerySet، تمام متدهای دستکاری شده ای که پیش تر مشاهده کردین را در نظر داشته باشین (filter, all, exclude, order_by....)

می توانید برای فیلتر کردن عملیات، از خصیصه های مدلِ لینک شده استفاده کنین. اگه بخواین تمام دامنه های آنلاینی که نامِ Dreamreal آن ها شامل ‘company’ است، را مشاهده کنین، می توانید از کد زیر استفاده کنین –

>>> Online.objects.filter(company__name__contains = 'company'

نکته –پایگاه داده ی SQL از چنین queryای پشتیبانی می کنه ولی پایگاه داده های non-relational که در آن ها joins (اتصال) و دو '_' در آن ها وجود داره، از آن پشتیبانی نمی کنن.

با این وجود این روش تنها روشِ لینک کردن مدل ها نیست، می توانید از روشِ OneToOneField نیز استفاده کنین که لینکیِه که تضمین می کنه که رابطه ی میان دو شیء، منحصر به فردِه. اگه در مثال بالا از OneToOneField استفاده می کردیم، برای هر شرکت ثبت شده در Dreamreal فقط یک شرکتِ ثبتیِ آنلاین وجود می داشت و اگه از روش سوم هم استفاده می کردیم باز هم به همین صورت بود.

روش آخر، ManyToManyField برای ایجاد رابطه میانِ جدول های (n-n) است. در نظر داشته باشین که SQL مبتنی بر DB از این روش پشتیبانی می کنه.

مبحث آموزشی

آموزش Django

Learn Django

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

تبلیغات

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد