Django - Người mẫu

Mô hình là một lớp đại diện cho bảng hoặc tập hợp trong DB của chúng ta và trong đó mọi thuộc tính của lớp là một trường của bảng hoặc tập hợp. Mô hình được xác định trong app / models.py (trong ví dụ của chúng tôi: myapp / models.py)

Tạo mô hình

Sau đây là một mô hình Dreamreal được tạo ra làm ví dụ:

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"

Mọi mô hình kế thừa từ django.db.models.Model.

Lớp của chúng ta có 4 thuộc tính (3 CharField và 1 Integer), chúng sẽ là các trường của bảng.

Lớp Meta với thuộc tính db_table cho phép chúng ta xác định bảng hoặc tên tập hợp thực tế. Django tự động đặt tên cho bảng hoặc bộ sưu tập: myapp_modelName. Lớp này sẽ cho phép bạn đặt tên của bảng theo ý bạn.

Có nhiều loại trường hơn trong django.db.models, bạn có thể tìm hiểu thêm về chúng trên https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

Sau khi tạo mô hình của mình, bạn sẽ cần Django để tạo cơ sở dữ liệu thực tế -

$python manage.py syncdb

Thao tác dữ liệu (CRUD)

Hãy tạo chế độ xem "crudops" để xem cách chúng ta có thể thực hiện các hoạt động CRUD trên các mô hình. Sau đó, myapp / views.py của chúng tôi sẽ trông giống như -

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)

Thao tác dữ liệu khác

Hãy cùng khám phá các thao tác khác mà chúng ta có thể thực hiện trên Mô hình. Lưu ý rằng các hoạt động CRUD đã được thực hiện trên các phiên bản của mô hình của chúng tôi, bây giờ chúng tôi sẽ làm việc trực tiếp với lớp đại diện cho mô hình của chúng tôi.

Hãy tạo chế độ xem 'quy trình dữ liệu' trong 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)

Liên kết mô hình

Django ORM đưa ra 3 cách để liên kết các mô hình -

Một trong những trường hợp đầu tiên mà chúng ta sẽ thấy ở đây là các mối quan hệ một-nhiều. Như bạn có thể thấy trong ví dụ trên, công ty Dreamreal có thể có nhiều trang web trực tuyến. Việc xác định mối quan hệ đó được thực hiện bằng cách sử dụng 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"

Như bạn có thể thấy trong myapp / models.py được cập nhật của chúng tôi, chúng tôi đã thêm mô hình trực tuyến và liên kết nó với mô hình Dreamreal của chúng tôi.

Hãy kiểm tra xem tất cả những điều này đang hoạt động như thế nào qua shell management.py -

Đầu tiên, hãy tạo một số công ty (mục nhập Dreamreal) để thử nghiệm trong trình bao Django của chúng tôi -

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

Hiện một số miền được lưu trữ -

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

Việc truy cập thuộc tính của công ty lưu trữ (mục nhập Dreamreal) từ một miền trực tuyến rất đơn giản -

>>> on1.company.name

Và nếu chúng tôi muốn biết tất cả miền trực tuyến được lưu trữ bởi một Công ty ở Dreamreal, chúng tôi sẽ sử dụng mã -

>>> dr1.online_set.all()

Để nhận QuerySet, hãy lưu ý rằng tất cả các phương pháp thao tác mà chúng ta đã thấy trước đây (lọc, tất cả, loại trừ, order_by ...)

Bạn cũng có thể truy cập các thuộc tính mô hình được liên kết cho các hoạt động lọc, giả sử bạn muốn nhận tất cả các miền trực tuyến có tên Dreamreal chứa 'công ty' -

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

Note- Loại truy vấn đó chỉ được hỗ trợ cho SQL DB. Nó sẽ không hoạt động đối với DB không quan hệ khi các phép nối không tồn tại và có hai '_'.

Nhưng đó không phải là cách duy nhất để liên kết các mô hình, bạn còn có OneToOneField, một liên kết đảm bảo rằng mối quan hệ giữa hai đối tượng là duy nhất. Nếu chúng tôi sử dụng OneToOneField trong ví dụ của chúng tôi ở trên, điều đó có nghĩa là đối với mỗi mục nhập Dreamreal chỉ có thể có một mục nhập Trực tuyến và theo cách khác.

Và cuối cùng, quan hệ ManyToManyField cho (nn) giữa các bảng. Lưu ý, chúng có liên quan đến DB dựa trên SQL.