이번장에는 foreign keys 사용법에 대해 알아보겠다.
foreign keys를 통해서 서로다른 database table의 객체를 연결키켜 관리할수있다.
우리가 만약 지금처럼 하나의 tutorial object으로 contents를 추가해 나간다면 굉장히 큰 단위의 object가 될것이고 관리가 어려워 질것이다. 그래서 tutorial categories-series-content 단위로 table을 만들고 이를 foreign key로 만들어 관리하려한다.
우선 기존의 model을 두개를 더 만들것이다. tutorial-> series and category.
series는 tutorial을 가르키는 foreign key를 가질것이고 series는 또 각 category의 foreign key로 부터 연결되게 만들어보자
우선 TutorialCategory model을 만들자
mysite/main/models.py
class TutorialCategory(models.Model): tutorial_category = models.CharField(max_length=200) category_summary = models.CharField(max_length=200) category_slug = models.CharField(max_length=200, default=1) class Meta: # Gives the proper plural name for admin verbose_name_plural = "Categories" def __str__(self): return self.tutorial_category
category_slug는 우리가 가르키고자하는 category의 URL이다.
예를 들어 "data Analysis"라는 category로 이동하고자 하면 그 이름의 url로 연결되어야 한다.
다음은 TutorialCategory를 가르키는 TutorialSeries라는 model을 만들것이다.
class TutorialSeries(models.Model): tutorial_series = models.CharField(max_length=200) tutorial_category = models.ForeignKey(TutorialCategory, default=1, verbose_name="Category", on_delete=models.SET_DEFAULT) series_summary = models.CharField(max_length=200) class Meta: # otherwise we get "Tutorial Seriess in admin" verbose_name_plural = "Series" def __str__(self): return self.tutorial_series
on_delete
은 만약 category가 삭제되엇을때 tutorial도 같이 지워지는게 아니라 남아있어야한다. 그래서 default로 값을 체워두는거다.
class Tutorial(models.Model): tutorial_title = models.CharField(max_length=200) tutorial_content = models.TextField() tutorial_published = models.DateTimeField('date published') #https://docs.djangoproject.com/en/2.1/ref/models/fields/#django.db.models.ForeignKey.on_delete tutorial_series = models.ForeignKey(TutorialSeries, default=1, verbose_name="Series", on_delete=models.SET_DEFAULT) tutorial_slug = models.CharField(max_length=200, default=1) def __str__(self): return self.tutorial_title
자 많은게 model에 추가되었으니 migration 하자
python manage.py makemigrations Migrations for 'main': main\migrations\0005_auto_20190116_1349.py - Create model TutorialCategory - Create model TutorialSeries - Add field tutorial_slug to tutorial - Alter field tutorial_published on tutorial - Add field tutorial_series to tutorial
python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, main, sessions Running migrations: Applying main.0005_auto_20190116_1349... OK
Admin page에서도 categories series를 관리할수있게 수정해보자
mysite/main/admin.py
from .models import Tutorial, TutorialSeries, TutorialCategory ... class TutorialAdmin(admin.ModelAdmin): fieldsets = [ ("Title/date", {'fields': ["tutorial_title", "tutorial_published"]}), ("URL", {'fields': ["tutorial_slug"]}), ("Series", {'fields': ["tutorial_series"]}), ("Content", {"fields": ["tutorial_content"]}) ] formfield_overrides = { models.TextField: {'widget': TinyMCE(attrs={'cols': 80, 'rows': 30})}, } admin.site.register(TutorialSeries) admin.site.register(TutorialCategory) admin.site.register(Tutorial,TutorialAdmin)
'Backup > Django' 카테고리의 다른 글
[Django #11] Dynamic sidebar (0) | 2019.02.06 |
---|---|
[Django #10] Working with Foreign Keys (0) | 2019.02.05 |
[Django #8] User Login and Logout (0) | 2019.02.05 |
[Django #7] Messages (0) | 2019.02.05 |
[Django #6] User Registration (1) | 2019.02.04 |