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와 관련이 있습니다.