본문 바로가기

Backup/Django

[Django #9] Foreign Keys with Models

이번장에는 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