2014-01-14 5 views
0

모든 레서피에 분류를 부여하고 싶습니다. 3 가지 레벨 (제목 -> 카테고리 -> 하위 카테고리)이 필요합니다. 나는 다음과 같은 모델을 가지고 : 처음에 나는 레시피 모델에 외래 키를 추가 할 생각Django - 두 개 이상의 외래 키가있는 모델

class Recipe(models.Model): 
    content = HTMLField() 
    ... 

class Subject(models.Model): 
    name = models.CharField() 

class Category(models.Model): 
    subject = models.ForeignKey(Subject) 
    name = models.CharField() 

class Subcategory(models.Model): 
    category = models.ForeignKey(Category) 
    name = models.CharField() 

, 뭔가 같은 : 그래서

subcategory = models.ForeignKey(Subcategory) 

나는이 주제에 하위 범주에서 갈 수 있었다, 간단한 조인.

하지만 어쩌면 성능을 개선하고 확장 가능한 시스템을 가지고 새로운 테이블을 생성하는 것이 좋습니다, 이것은 나의 생각입니다 :이 마지막 솔루션을 사용

class Classification(models.Model): 
    recipe = models.ForeignKey(Recipe) 
    subject = models.ForeignKey(Subject) 
    category = models.ForeignKey(Category) 
    subcategory = models.ForeignKey(Subcategory) 

, 나는 레시피 관리자에서 하위 범주를 선택합니다 패널을 클릭 한 다음 다른 필드 (카테고리 및 주제)를 자동으로 채 웁니다. 내 질문은 : 어떻게 할 수 있습니까?

감사합니다.

답변

2

첫 번째 디자인이 실제로 최고입니다. 완전히 denormalized database design입니다. 두 번째 디자인은 귀하의 주제와 관련이없는 귀하의 카테고리와 관련이없는 하위 카테고리에 귀하의 제조법을 넣을 가능성이 있습니다. 따라서 성능에서 얻은 결과가 데이터 무결성에서 손실 될 수 있습니다.

1

Subject, Category, Subcategory 및 Recipe (ForeignKey 포함) 클래스는 완전히 정규화 된 데이터베이스 디자인을 추가합니다. Classification은 데이터베이스를 비정규 화하는 과정의 일부입니다 (예 : 성능 문제).

귀하의 질문에 대답 :

recipe = Recipe.objects.get(pk=1) # just assume that you have object instance under recipe 
r_subcategory = recipe.subcategory 
r_category = r_subcategory.category 
r_subject = r_category.subject 
new_classification = Classification(subject=r_subject, category=r_category, subcategory=r_subcategory, recipe=recipe) 
new_classification.save() 

난 정말 내가 쉽게 그것을위한 SQL 요청을 생산할 수 (하나 개의 데이터베이스 요청을 만들 수있는 방법이 있는지 알고 싶습니다,하지만 난 방법을 모르는 장고 ORM과 동일하게 달성)