Django - Model

Model adalah kelas yang mewakili tabel atau koleksi di DB kami, dan di mana setiap atribut kelas adalah bidang tabel atau koleksi. Model didefinisikan di app / models.py (dalam contoh kita: myapp / models.py)

Membuat Model

Berikut adalah model Dreamreal yang dibuat sebagai contoh -

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"

Setiap model mewarisi dari django.db.models.Model.

Kelas kita memiliki 4 atribut (3 CharField dan 1 Integer), itu akan menjadi bidang tabel.

Kelas Meta dengan atribut db_table memungkinkan kita menentukan tabel atau nama koleksi yang sebenarnya. Django menamai tabel atau kumpulan secara otomatis: myapp_modelName. Kelas ini akan membiarkan Anda memaksa nama tabel sesuai keinginan Anda.

Ada lebih banyak tipe bidang di django.db.models, Anda dapat mempelajarinya lebih lanjut di https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Setelah membuat model Anda, Anda akan membutuhkan Django untuk membuat basisdata sebenarnya -

$python manage.py syncdb

Memanipulasi Data (CRUD)

Mari buat tampilan "crudop" untuk melihat bagaimana kita dapat melakukan operasi CRUD pada model. Myapp / views.py kita akan terlihat seperti -

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 = "[email protected]", 
      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 = "[email protected]", 
      name = "sorex", phonenumber = "002376970"
   )
   
   dreamreal.save()
   res += 'Updating entry<br>'
   
   dreamreal = Dreamreal.objects.get(name = 'sorex')
   dreamreal.name = 'thierry'
   dreamreal.save()
   
   return HttpResponse(res)

Manipulasi Data Lainnya

Mari jelajahi manipulasi lain yang dapat kita lakukan pada Model. Perhatikan bahwa operasi CRUD dilakukan pada contoh model kami, sekarang kami akan bekerja secara langsung dengan kelas yang mewakili model kami.

Mari buat tampilan 'manipulasi data' di 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)

Menghubungkan Model

Django ORM menawarkan 3 cara untuk menghubungkan model -

Salah satu kasus pertama yang akan kita lihat di sini adalah hubungan satu-ke-banyak. Seperti yang Anda lihat pada contoh di atas, perusahaan Dreamreal dapat memiliki banyak situs online. Mendefinisikan relasi tersebut dilakukan dengan menggunakan 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"

Seperti yang Anda lihat di myapp / models.py kami yang telah diperbarui, kami menambahkan model online dan menautkannya ke model Dreamreal kami.

Mari kita periksa bagaimana semua ini bekerja melalui manage.py shell -

Pertama mari buat beberapa perusahaan (entri Dreamreal) untuk pengujian di shell Django kita -

$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()

Sekarang beberapa domain yang dihosting -

>>> 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()

Mengakses atribut perusahaan hosting (entri Dreamreal) dari domain online itu sederhana -

>>> on1.company.name

Dan jika kita ingin mengetahui semua domain online yang dihosting oleh Perusahaan di Dreamreal kita akan menggunakan kode -

>>> dr1.online_set.all()

Untuk mendapatkan QuerySet, perhatikan bahwa semua metode manipulasi yang telah kita lihat sebelumnya (filter, all, exclude, order_by ....)

Anda juga dapat mengakses atribut model tertaut untuk operasi pemfilteran, katakanlah Anda ingin mendapatkan semua domain online di mana nama Dreamreal berisi 'perusahaan' -

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

Note- Kueri semacam itu hanya didukung untuk SQL DB. Ini tidak akan berfungsi untuk DB non-relasional di mana tidak ada gabungan dan ada dua '_'.

Tapi itu bukan satu-satunya cara untuk menautkan model, Anda juga memiliki OneToOneField, tautan yang menjamin bahwa hubungan antara dua objek itu unik. Jika kami menggunakan OneToOneField dalam contoh kami di atas, itu berarti untuk setiap entri Dreamreal hanya satu entri Online yang mungkin dan dengan cara lain ke.

Dan yang terakhir, hubungan ManyToManyField for (nn) antar tabel. Catatan, itu relevan untuk DB berbasis SQL.