Django-모델

모델은 DB에서 테이블 또는 컬렉션을 나타내는 클래스이며 클래스의 모든 속성은 테이블 또는 컬렉션의 필드입니다. 모델은 app / models.py에 정의됩니다 (이 예에서는 myapp / models.py).

모델 생성

다음은 예제로 만든 Dreamreal 모델입니다.

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)이 있으며, 이들은 테이블 필드가됩니다.

db_table 속성이있는 Meta 클래스를 사용하면 실제 테이블 또는 컬렉션 이름을 정의 할 수 있습니다. Django는 테이블 또는 컬렉션의 이름을 자동으로 myapp_modelName으로 지정합니다. 이 클래스를 사용하면 테이블 이름을 원하는대로 강제 지정할 수 있습니다.

django.db.models에 더 많은 필드 유형이 있습니다. https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types

모델을 만든 후 실제 데이터베이스를 생성하려면 Django가 필요합니다.

$python manage.py syncdb

데이터 조작 (CRUD)

모델에서 CRUD 작업을 수행 할 수있는 방법을보기 위해 "crudops"보기를 만들어 보겠습니다. 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 = "[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)

기타 데이터 조작

모델에서 수행 할 수있는 다른 조작을 살펴 보겠습니다. CRUD 작업은 모델의 인스턴스에서 수행되었으므로 이제 모델을 나타내는 클래스로 직접 작업 할 것입니다.

'데이터 조작'뷰를 생성 해 보겠습니다. 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)

모델 연결

Django ORM은 모델을 연결하는 3 가지 방법을 제공합니다.

여기서 보게 될 첫 번째 사례 중 하나는 일대 다 관계입니다. 위의 예에서 볼 수 있듯이 Dreamreal 회사는 여러 온라인 웹 사이트를 가질 수 있습니다. 그 관계를 정의하는 것은 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"

업데이트 된 myapp / models.py에서 볼 수 있듯이 온라인 모델을 추가하고 Dreamreal 모델에 연결했습니다.

이 모든 것이 manage.py 셸을 통해 어떻게 작동하는지 확인해 보겠습니다.

먼저 Django 셸에서 테스트 할 회사 (Dreamreal 항목)를 생성 해 보겠습니다.

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

이제 일부 호스팅 된 도메인-

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

온라인 도메인에서 호스팅 회사 (Dreamreal 항목)의 속성에 액세스하는 것은 간단합니다.

>>> on1.company.name

Dreamreal의 회사에서 호스팅하는 모든 온라인 도메인을 알고 싶다면 코드를 사용합니다.

>>> dr1.online_set.all()

QuerySet을 얻으려면 이전에 본 모든 조작 방법 (filter, all, exclude, order_by ....)

또한 필터링 작업을 위해 링크 된 모델 속성에 액세스 할 수 있습니다. Dreamreal 이름에 'company'가 포함 된 모든 온라인 도메인을 가져오고 싶다고 가정 해 보겠습니다.

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

Note− 이러한 쿼리는 SQL DB에서만 지원됩니다. 조인이 존재하지 않고 두 개의 '_'가있는 비 관계형 DB에서는 작동하지 않습니다.

하지만 이것이 모델을 연결하는 유일한 방법은 아닙니다. 두 개체 간의 관계가 고유함을 보장하는 링크 인 OneToOneField도 있습니다. 위의 예에서 OneToOneField를 사용했다면 모든 Dreamreal 항목에 대해 하나의 온라인 항목 만 가능하고 반대의 경우에는 가능합니다.

마지막으로 테이블 간 (nn) 관계에 대한 ManyToManyField입니다. SQL 기반 DB와 관련이 있습니다.