-
<DJANGO>[MODEL]Flower in my dev/Django 2017. 5. 7. 14:50
[Model]
1. 기본 구조
=123456#django.db.models.Modelfrom django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)cs 12345CREATE TABLE myapp_person ("id" serial NOT NULL PRIMARY KEY,"first_name" varchar(30) NOT NULL,"last_name" varchar(30) NOT NULL);cs 12345INSTALLED_APPS = [#...'myapp',#...]cs - app 생성
- models.py에서 django.db.models을 import
- Model을 상속
- models 내부의 각각 Field 함수로 컬럼 설정
- settings.py의 INSTALLED_APPS에 생성한 app을 추가
- manage.py migrate 실행
- manage.py makemigrations 실행
2. 기본 Filed
123456789101112from django.db import modelsclass Musician(models.Model):first_name = models.CharField(max_length=50)last_name = models.CharField(max_length=50)instrument = models.CharField(max_length=100)class Album(models.Model):artist = models.ForeignKey(Musician, on_delete=models.CASCADE)name = models.CharField(max_length=100)release_date = models.DateField()num_stars = models.IntegerField()cs 3. Filed Options
- null : (default=False) True 일때, 값이 없으면 null 등록
- blank : (default=False) True 일때, 값이 없으면 그대로 빈값 등록 <주의 : 전달파라미터 확인해야함>
- choices : 튜플로 작성된 key와 value를 컬럼에 매핑. key를 입력 받고 get_shirt_size_display()로 value를 확인 할 수 있다.
1234567YEAR_IN_SCHOOL_CHOICES = (('FR', 'Freshman'),('SO', 'Sophomore'),('JR', 'Junior'),('SR', 'Senior'),('GR', 'Graduate'),)cs 12345678910from django.db import modelsclass Person(models.Model):SHIRT_SIZES = (('S', 'Small'),('M', 'Medium'),('L', 'Large'),)name = models.CharField(max_length=60)shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)cs 123456>>> p = Person(name="Fred Flintstone", shirt_size="L")>>> p.save()>>> p.shirt_size'L'>>> p.get_shirt_size_display()'Large'cs - default : 값이 없을 경우 기본 값을 설정
- help_text : form widget에서 help로 확인할 수 있는 정보 ( 문서 작성 시 유용함 )
- primary_key : True 일때, primary key로 설정 됨 (django의 기본 primary key는 "id" 컬럼)
1234from django.db import modelsclass Fruit(models.Model):name = models.CharField(max_length=100, primary_key=True)cs 12345>>> fruit = Fruit.objects.create(name='Apple')>>> fruit.name = 'Pear'>>> fruit.save()>>> Fruit.objects.values_list('name', flat=True)['Apple', 'Pear']cs 1id = models.AutoField(primary_key=True)cs - unique : null이 1회 가능한 컬럼으로 설정
4. Verbose field names
- Field를 파악할 수 있는 이름
- default : field 이름
1first_name = models.CharField(max_length=30)cs - 설정
1first_name = models.CharField("person's first name", max_length=30)cs - ForeignKey, ManyToManyField, OneToOneField는 필요함
1234567891011poll = models.ForeignKey(Poll,on_delete=models.CASCADE,verbose_name="the related poll",)sites = models.ManyToManyField(Site, verbose_name="list of sites")place = models.OneToOneField(Place,on_delete=models.CASCADE,verbose_name="related place",)cs 5. 1:1 관계
- 예제
123456789101112131415161718192021222324252627from django.db import modelsclass Place(models.Model):name = models.CharField(max_length=50)address = models.CharField(max_length=80)def __str__(self):return "%s the place" % self.nameclass Restaurant(models.Model):place = models.OneToOneField(Place,on_delete=models.CASCADE,primary_key=True,)serves_hot_dogs = models.BooleanField(default=False)serves_pizza = models.BooleanField(default=False)def __str__(self):return "%s the restaurant" % self.place.nameclass Waiter(models.Model):restaurant = models.ForeignKey(Restaurant,on_delete=models.CASCADE)name = models.CharField(max_length=50)def __str__(self):return "%s the waiter at %s" % (self.name, self.restaurant)cs 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990###>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')>>> p1.save()>>> p2 = Place(name='Ace Hardware', address='1013 N. Ashland')>>> p2.save()###>>> r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)>>> r.save()###>>> r.place<Place: Demon Dogs the place>###>>> p1.restaurant<Restaurant: Demon Dogs the restaurant>###>>> from django.core.exceptions import ObjectDoesNotExist>>> try:>>> p2.restaurant>>> except ObjectDoesNotExist:>>> print("There is no restaurant here.")There is no restaurant here.###> hasattr(p2, 'restaurant')False###>>> r.place = p2>>> r.save()>>> p2.restaurant<Restaurant: Ace Hardware the restaurant>>>> r.place<Place: Ace Hardware the place>###>>> p1.restaurant = r>>> p1.restaurant<Restaurant: Demon Dogs the restaurant>###>>> p3 = Place(name='Demon Dogs', address='944 W. Fullerton')>>> Restaurant.objects.create(place=p3, serves_hot_dogs=True, serves_pizza=False)Traceback (most recent call last):...ValueError: save() prohibited to prevent data loss due to unsaved related object 'place'.###>>> Restaurant.objects.all()<QuerySet [<Restaurant: Demon Dogs the restaurant>, <Restaurant: Ace Hardware the restaurant>]>###>>> Place.objects.order_by('name')<QuerySet [<Place: Ace Hardware the place>, <Place: Demon Dogs the place>]>###>>> Restaurant.objects.get(place=p1)<Restaurant: Demon Dogs the restaurant>>>> Restaurant.objects.get(place__pk=1)<Restaurant: Demon Dogs the restaurant>>>> Restaurant.objects.filter(place__name__startswith="Demon")<QuerySet [<Restaurant: Demon Dogs the restaurant>]>>>> Restaurant.objects.exclude(place__address__contains="Ashland")<QuerySet [<Restaurant: Demon Dogs the restaurant>]>###>>> Place.objects.get(pk=1)<Place: Demon Dogs the place>>>> Place.objects.get(restaurant__place=p1)<Place: Demon Dogs the place>>>> Place.objects.get(restaurant=r)<Place: Demon Dogs the place>>>> Place.objects.get(restaurant__place__name__startswith="Demon")<Place: Demon Dogs the place>###>>> w = r.waiter_set.create(name='Joe')>>> w<Waiter: Joe the waiter at Demon Dogs the restaurant>###>>> Waiter.objects.filter(restaurant__place=p1)<QuerySet [<Waiter: Joe the waiter at Demon Dogs the restaurant>]>>>> Waiter.objects.filter(restaurant__place__name__startswith="Demon")<QuerySet [<Waiter: Joe the waiter at Demon Dogs the restaurant>]>cs 6. 1대n 관계
- 기본 구조
12345678from django.db import modelsclass Manufacturer(models.Model):# ...passclass Car(models.Model):manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)# ...cs 123456class Car(models.Model):company_that_makes_it = models.ForeignKey(Manufacturer,on_delete=models.CASCADE,)# ...cs - 예제
12345678910111213141516171819from django.db import modelsclass Reporter(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)email = models.EmailField()def __str__(self):return "%s %s" % (self.first_name, self.last_name)class Article(models.Model):headline = models.CharField(max_length=100)pub_date = models.DateField()reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)def __str__(self):return self.headlineclass Meta:ordering = ('headline',)cs 1234>>> r = Reporter(first_name='John', last_name='Smith', email='john@example.com')>>> r.save()>>> r2 = Reporter(first_name='Paul', last_name='Jones', email='paul@example.com')>>> r2.save()cs 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127###>>> from datetime import date>>> a = Article(id=None, headline="This is a test", pub_date=date(2005, 7, 27), reporter=r)>>> a.save()>>> a.reporter.id 1>>> a.reporter<Reporter: John Smith>###>>> r3 = Reporter(first_name='John', last_name='Smith', email='john@example.com')>>> Article.objects.create(headline="This is a test", pub_date=date(2005, 7, 27), reporter=r3)Traceback (most recent call last):...ValueError: save() prohibited to prevent data loss due to unsaved related object 'reporter'.###>>> r = a.reporter###>>> new_article = r.article_set.create(headline="John's second story", pub_date=date(2005, 7, 29))>>> new_article<Article: "John's second story">>>> new_article.reporter<Reporter: John Smith>>>> new_article.reporter.id1###>>> new_article2 = Article(headline="Paul's story", pub_date=date(2006, 1, 17))>>> r.article_set.add(new_article2)>>> new_article2.reporter<Reporter: John Smith>>>> new_article2.reporter.id1>>> r.article_set.all()<QuerySet [<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]>###>>> r2.article_set.add(new_article2) >>> new_article2.reporter.id2>>> new_article2.reporter<Reporter: Paul Jones>###>>> r.article_set.add(r2)Traceback (most recent call last):...TypeError: 'Article' instance expected>>> r.article_set.all()<QuerySet [<Article: "John's second story">, <Article: This is a test>]> >>> r2.article_set.all()<QuerySet [<Article: "Paul's story">]>>>> r.article_set.count() 2>>> r2.article_set.count() 1###>>> r.article_set.filter(headline__startswith='This') <QuerySet [<Article: This is a test>]># Find all Articles for any Reporter whose first name is "John".>>> Article.objects.filter(reporter__first_name='John')<QuerySet [<Article: "John's second story">, <Article: This is a test>]>###>>> Article.objects.filter(reporter__first_name='John')<QuerySet [<Article: "John's second story">, <Article: This is a test>]>###>>> Article.objects.filter(reporter__first_name='John', reporter__last_name='Smith')<QuerySet [<Article: "John's second story">, <Article: This is a test>]>###>>> Article.objects.filter(reporter__pk=1)<QuerySet [<Article: "John's second story">, <Article: This is a test>]>>>> Article.objects.filter(reporter=1)<QuerySet [<Article: "John's second story">, <Article: This is a test>]>>>> Article.objects.filter(reporter=r)<QuerySet [<Article: "John's second story">, <Article: This is a test>]>>>> Article.objects.filter(reporter__in=[1,2]).distinct()<QuerySet [<Article: "John's second story">, <Article: "Paul's story">, <Article: This is a test>]>###>>> Article.objects.filter(reporter__in=[r,r2]).distinct()<QuerySet [<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]>###>>> Article.objects.filter(reporter__in=Reporter.objects.filter(first_name='John')).distinct()<QuerySet [<Article: "John's second story">, <Article: This is a test>]>###>>> Reporter.objects.filter(article__pk=1)<QuerySet [<Reporter: John Smith>]>>>> Reporter.objects.filter(article=1)<QuerySet [<Reporter: John Smith>]>>>> Reporter.objects.filter(article=a)<QuerySet [<Reporter: John Smith>]>>>> Reporter.objects.filter(article__headline__startswith='This')<QuerySet [<Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>]>>>> Reporter.objects.filter(article__headline__startswith='This').distinct()<QuerySet [<Reporter: John Smith>]>###>>> Reporter.objects.filter(article__headline__startswith='This').count()3>>> Reporter.objects.filter(article__headline__startswith='This').distinct().count()1###>>> Reporter.objects.filter(article__reporter__first_name__startswith='John')<QuerySet [<Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>]>>>> Reporter.objects.filter(article__reporter__first_name__startswith='John').distinct()<QuerySet [<Reporter: John Smith>]>>>> Reporter.objects.filter(article__reporter=r).distinct()<QuerySet [<Reporter: John Smith>]>###>>> Article.objects.all()<QuerySet [<Article: "John's second story">, <Article: "Paul's story">, <Article: This is a test>]>>>> Reporter.objects.order_by('first_name')<QuerySet [<Reporter: John Smith>, <Reporter: Paul Jones>]>>>> r2.delete()>>> Article.objects.all()<QuerySet [<Article: "John's second story">, <Article: This is a test>]>>>> Reporter.objects.order_by('first_name')<QuerySet [<Reporter: John Smith>]>>>> Reporter.objects.filter(article__headline__startswith='This').delete()>>> Reporter.objects.all()<QuerySet []>>>> Article.objects.all()<QuerySet []>cs 7. n대n 관계
- 기본 구조123456789from django.db import modelsclass Topping(models.Model):# ...passclass Pizza(models.Model):# ...toppings = models.ManyToManyField(Topping)cs - 예제
12345678910111213141516from django.db import modelsclass Publication(models.Model):title = models.CharField(max_length=30)def __str__(self):return self.titleclass Meta:ordering = ('title',)class Article(models.Model):headline = models.CharField(max_length=100)publications = models.ManyToManyField(Publication)def __str__(self):return self.headlineclass Meta:ordering = ('headline',)cs 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200###>>> p1 = Publication(title='The Python Journal') >>> p1.save()>>> p2 = Publication(title='Science News')>>> p2.save()>>> p3 = Publication(title='Science Weekly') >>> p3.save()###>>> a1 = Article(headline='Django lets you build Web apps easily')###>>> a1.publications.add(p1)Traceback (most recent call last):...ValueError: 'Article' instance needs to have a primary key value before a many-to-many relationship can be used.###>>> a1.save()###>>> a1.publications.add(p1)###>>> a2 = Article(headline='NASA uses Python')>>> a2.save()>>> a2.publications.add(p1, p2)>>> a2.publications.add(p3)###>>> a2.publications.add(p3)###>>> a2.publications.add(a1)Traceback (most recent call last):...TypeError: 'Publication' instance expected###>>> new_publication = a2.publications.create(title='Highlights for Children')###>>> a1.publications.all()<QuerySet [<Publication: The Python Journal>]>>>> a2.publications.all()<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>###>>> p2.article_set.all()<QuerySet [<Article: NASA uses Python>]>>>> p1.article_set.all()<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Publication.objects.get(id=4).article_set.all()<QuerySet [<Article: NASA uses Python>]>###>>> Article.objects.filter(publications__id=1)<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications__pk=1)<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications=1)<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications=p1)<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications__title__startswith="Science")<QuerySet [<Article: NASA uses Python>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications__title__startswith="Science").distinct()<QuerySet [<Article: NASA uses Python>]>###>>> Article.objects.filter(publications__title__startswith="Science").count() 2>>> Article.objects.filter(publications__title__startswith="Science").distinct().count()1>>> Article.objects.filter(publications__in=[1,2]).distinct()<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]>>>> Article.objects.filter(publications__in=[p1,p2]).distinct()<QuerySet [<Article: Django lets you build Web apps easily>, <Article: NASA usesPython>]>###>>> Publication.objects.filter(id=1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(pk=1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(article__headline__startswith="NASA")<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>,,!<Publication: Science Weekly>, <Publication:>>> Publication.objects.filter(article__id=1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(article__pk=1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(article=1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(article=a1)<QuerySet [<Publication: The Python Journal>]>>>> Publication.objects.filter(article__in=[1,2]).distinct()<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>>>> Publication.objects.filter(article__in=[a1,a2]).distinct()<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]>###>>> Article.objects.exclude(publications=p2)<QuerySet [<Article: Django lets you build Web apps easily>]>###>>> p1.delete()>>> Publication.objects.all()<QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>]>>>> a1 = Article.objects.get(pk=1)>>> a1.publications.all()<QuerySet []>###>>> a2.delete()>>> Article.objects.all()<QuerySet [<Article: Django lets you build Web apps easily>]>>>> p2.article_set.all()<QuerySet []>###>>> a4 = Article(headline='NASA finds intelligent life on Earth')>>> a4.save()>>> p2.article_set.add(a4)>>> p2.article_set.all()<QuerySet [<Article: NASA finds intelligent life on Earth>]>>>> a4.publications.all()<QuerySet [<Publication: Science News>]>###>>> new_article = p2.article_set.create(headline='Oxygen-free diet works wonders')>>> p2.article_set.all()<QuerySet [<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]>>>> a5 = p2.article_set.all()[1]>>> a5.publications.all()<QuerySet [<Publication: Science News>]>###>>> a4.publications.remove(p2)>>> p2.article_set.all()<QuerySet [<Article: Oxygen-free diet works wonders>]>>>> a4.publications.all()<QuerySet []>###>>> p2.article_set.remove(a5)>>> p2.article_set.all()<QuerySet []>>>> a5.publications.all()<QuerySet []>###>>> a4.publications.all()<QuerySet [<Publication: Science News>]>>>> a4.publications.set([p3])>>> a4.publications.all()<QuerySet [<Publication: Science Weekly>]>###>>> p2.article_set.clear()>>> p2.article_set.all()<QuerySet []>###>>> p2.article_set.add(a4, a5)>>> p2.article_set.all()<QuerySet [<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]>>>> a4.publications.all()<QuerySet [<Publication: Science News>, <Publication: Science Weekly>]>>>> a4.publications.clear()>>> a4.publications.all()<QuerySet []>>>> p2.article_set.all()<QuerySet [<Article: Oxygen-free diet works wonders>]>###>>> p1 = Publication(title='The Python Journal')>>> p1.save()>>> a2 = Article(headline='NASA uses Python')>>> a2.save()>>> a2.publications.add(p1, p2, p3)###>>> Publication.objects.filter(title__startswith='Science').delete()>>> Publication.objects.all()<QuerySet [<Publication: Highlights for Children>, <Publication: The Python Journal>]>>>> Article.objects.all()<QuerySet [<Article: Django lets you build Web apps easily>,<Article: NASA findsintelligent life on Earth>, <Article: NASA uses Python>,<Article: Oxygen-free dietworks wonders>]>>>> a2.publications.all()<QuerySet [<Publication: The Python Journal>]>###>>> q = Article.objects.filter(headline__startswith='Django')>>> print(q)<QuerySet [<Article: Django lets you build Web apps easily>]>>>> q.delete()###>>> print(q)<QuerySet []>>>> p1.article_set.all()<QuerySet [<Article: NASA uses Python>]>cs - 추가 필드 예제
123456789101112131415161718from django.db import modelsclass Person(models.Model):name = models.CharField(max_length=128)def __str__(self):return self.nameclass Group(models.Model):name = models.CharField(max_length=128)members = models.ManyToManyField(Person, through='Membership')def __str__(self):return self.nameclass Membership(models.Model):person = models.ForeignKey(Person, on_delete=models.CASCADE)group = models.ForeignKey(Group, on_delete=models.CASCADE)date_joined = models.DateField()invite_reason = models.CharField(max_length=64)cs 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465###>>> ringo = Person.objects.create(name="Ringo Starr")>>> paul = Person.objects.create(name="Paul McCartney")>>> beatles = Group.objects.create(name="The Beatles")>>> m1 = Membership(person=ringo, group=beatles,... date_joined=date(1962, 8, 16),... invite_reason="Needed a new drummer.")>>> m1.save()>>> beatles.members.all()<QuerySet [<Person: Ringo Starr>]>>>> ringo.group_set.all()<QuerySet [<Group: The Beatles>]>>>> m2 = Membership.objects.create(person=paul, group=beatles,... date_joined=date(1960, 8, 1),... invite_reason="Wanted to form a band.")>>> beatles.members.all()<QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>]>###>>> # The following statements will not work>>> beatles.members.add(john)>>> beatles.members.create(name="George Harrison")>>> beatles.members.set([john, paul, ringo, george])###>>> Membership.objects.create(person=ringo, group=beatles,... date_joined=date(1968, 9, 4),... invite_reason="You've been gone for a month and we miss you.")>>> beatles.members.all()<QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>, <Person: Ringo Starr>]>>>> # This will not work because it cannot tell which membership to remove>>> beatles.members.remove(ringo)###>>> # Beatles have broken up>>> beatles.members.clear()>>> # Note that this deletes the intermediate model instances >>> Membership.objects.all()<QuerySet []>#### Find all the groups with a member whose name starts with 'Paul'>>> Group.objects.filter(members__name__startswith='Paul')<QuerySet [<Group: The Beatles>]>#### Find all the members of the Beatles that joined after 1 Jan 1961>>> Person.objects.filter(... group__name='The Beatles'... membership__date_joined__gt=date(1961,1,1))<QuerySet [<Person: Ringo Starr]>###>>> ringos_membership = Membership.objects.get(group=beatles, person=ringo)>>> ringos_membership.date_joineddatetime.date(1962, 8, 16)>>> ringos_membership.invite_reason'Needed a new drummer.'###>>> ringos_membership = ringo.membership_set.get(group=beatles)>>> ringos_membership.date_joineddatetime.date(1962, 8, 16)>>> ringos_membership.invite_reason'Needed a new drummer.'cs 8. Models across files
1234567891011from django.db import modelsfrom geography.models import ZipCodeclass Restaurant(models.Model):# ...zip_code = models.ForeignKey(ZipCode,on_delete=models.SET_NULL,blank=True,null=True,)cs 9. Field 명 제약
1234567class Example(models.Model):pass = models.IntegerField()# 'pass' is a reserved word!class Example(models.Model):foo__bar = models.IntegerField()# 'foo__bar' has two underscores!cs - 예약어
- 2번의 언더스코어
10. Meta options
1234567from django.db import modelsclass Ox(models.Model):horn_length = models.IntegerField()class Meta:ordering = ["horn_length"]verbose_name_plural = "oxen"cs - ordering : 정렬 컬럼 설정
- verbose_name : 요약된 컬럼의 이름
- verbose_name_plural : verbose_name의 복수형
- db_table : 테이블명
- base_manager_name : manager 지정
- abstract : 추상모델 (부모클래스는 DB에 테이블이 생성되지 않는다.)
- proxy : 프록시모델 (관계가 설정되거나, 상속받았을 경우 다리 역할을 한다.)12345678910111213141516171819202122232425###from django.db import modelsclass CommonInfo(models.Model):name = models.CharField(max_length=100)age = models.PositiveIntegerField()class Meta:abstract = Trueclass Student(CommonInfo):home_group = models.CharField(max_length=5)###from django.db import modelsclass CommonInfo(models.Model):# ...class Meta: abstract = Trueordering = ['name']class Student(CommonInfo):# ...class Meta(CommonInfo.Meta):db_table = 'student_info'cs 123456789101112131415161718192021222324###from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)class MyPerson(Person):class Meta:proxy = Truedef do_something(self):# ...pass###>>> p = Person.objects.create(first_name="foobar")>>> MyPerson.objects.get(first_name="foobar")<MyPerson: foobar>###class OrderedPerson(Person):class Meta:ordering = ["last_name"]proxy = Truecs 11. Models methods
123456789101112131415161718192021from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=50)last_name = models.CharField(max_length=50)birth_date = models.DateField()def baby_boomer_status(self):"Returns the person's baby-boomer status."import datetimeif self.birth_date < datetime.date(1945, 8, 1):return "Pre-boomer"elif self.birth_date < datetime.date(1965, 1, 1):return "Baby boomer"else:return "Post-boomer"@propertydef full_name(self):"Returns the person's full name."return '%s %s' % (self.first_name, self.last_name)cs - property 데코레이터를 사용하여 얻고 싶은 값을 지정하는 getter
- get_absolte_url() : 개별 데이터 접근 url (PK 접근)
12345678910111213141516###def get_absolute_url(self):return "/people/%i/" % self.id###def get_absolute_url(self):from django.urls import reversereturn reverse('people.views.details', args=[str(self.id)])###<!-- BAD template code. Avoid! --><a href="/people/{{ object.id }}/">{{ object.name }}</a>###<!-- Much better! --><a href="{{ object.get_absolute_url }}">{{ object.name }}</a>cs - save() : 데이터 저장시 추가 작업을 할 경우
12345678910111213141516171819202122###from django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def save(self, *args, **kwargs):do_something()super().save(*args, **kwargs) # Call the "real" save() method. do_something_else()###from django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def save(self, *args, **kwargs):if self.name == "Yoko Ono's blog":return # Yoko shall never have her own blog!else:super().save(*args, **kwargs) # Call the "real" save() method.cs 12. Model 상속
- Multi-table inheritance (부모는 자식을 포함한다.)
123456789101112131415161718192021222324252627###from django.db import modelsclass Place(models.Model):name = models.CharField(max_length=50)address = models.CharField(max_length=80)class Restaurant(Place):serves_hot_dogs = models.BooleanField(default=False)serves_pizza = models.BooleanField(default=False)###>>> Place.objects.filter(name="Bob's Cafe")>>> Restaurant.objects.filter(name="Bob's Cafe")###>>> p = Place.objects.get(id=12)# If p is a Restaurant object, this will give the child class:>>> p.restaurant<Restaurant: ...>###place_ptr = models.OneToOneField(Place,on_delete=models.CASCADE,parent_link=True,)- Meta and multi-table inheritance
(자식은 부모의 Meta 클래스를 상속받지 않지만, ordering, get_latest_by 옵션이 설정되지 않았을 경우에만 해당 설정값을 상속받는다.)
12345class ChildModel(ParentModel):# ...class Meta:# Remove parent's ordering effectordering = []cs
- Inheritance and reverse relations(부모를 N대N으로 관계를 맺으면 에러가 발생한다. 에러를 막기위해 related_name을 설정한다.)
12345678910111213###class Supplier(Place):customers = models.ManyToManyField(Place)###Reverse query name for 'Supplier.customers' clashes with reverse queryname for 'Supplier.place_ptr'.HINT: Add or change a related_name argument to the definition for'Supplier.customers' or 'Supplier.place_ptr'.###models. ManyToManyField(Place, related_name='provider')cs 'Flower in my dev > Django' 카테고리의 다른 글
<DJANGO>[HTTP Requests] (0) 2017.05.07 <DJANGO>[rest_framework & Class based view] (0) 2017.05.01 <DJANGO>[rest_framework & Func based view] (0) 2017.04.12 <DJANGO>[Hello World] (0) 2017.03.05 <DJANGO>[pyenv] 사용하기 (0) 2017.03.05