2012-12-14 1 views
2

저는 컴퓨터의 하드웨어를 하나로 묶는 앱을 만들고 있습니다. 이것은 장고와 함께 작업 한 첫 번째 시간입니다. 나는 다음과 같은 모델을 가지고 말 :Django manytomany : 고유하지 않은 여러 개의 관계를 추가 하시겠습니까?

class Memory(models.Model): 
    partNum = models.CharField() 
    capacity = models.CharField() 

class Computer(models.Model): 
    name = models.CharField() 
    memory = models.ManyToManyField(Memory) 
    # also has cpus, hard drives, and motherboard, but focus on memory for now 

한 메모리 개체는 많은 컴퓨터 개체에 속할 수 있고, 하나의 컴퓨터 개체는 많은 메모리 개체를 가질 수 있습니다 - hense 대다. 그러나 둘 이상의 컴퓨터를 사용하는 경우 컴퓨터에 동일한 메모리 스틱이 필요합니다.

그러나 django의 manytomany 필드 (기본값은?)는 메모리 - 컴퓨터 관계의 인스턴스 하나만 허용하며, 고유해야합니다. 이 주변의 어떤 방법?

관리자 페이지에서 동일한 메모리 개체를 컴퓨터에 많이 추가하려고하면 "이 컴퓨터 및 메모리와 컴퓨터 - 메모리 관계가 이미 있습니다"라는 메시지가 나타납니다. manage.py 쉘의 서버 객체에 동일한 메모리 객체를 두 번 이상 추가하려고하면 하나의 메모리 객체 만 추가 된 것처럼 보입니다. 중복 항목을 갖도록 데이터베이스를 수동으로 편집하려고하면 해당 항목이 이미 있음을 알리는 오류가 발생합니다. 나는 데이터베이스 구조에서 어떤 일종의 "고유 한 함께"색인을 수행하는 것을 보았습니다. 그 조항을 제거하기 위해 테이블을 변경했다면 문제가 해결 될까요? 아마도 장고 관리자가 예상보다 바보가 아닌 한 아마 없습니다.

내 옵션에는 어떤 것이 있습니까? 내 자신의 중간 모델을 작성하고 through 구조를 사용합니까? 그런데 멋진 filter_horizontal 위젯을 사용하지 않을 것입니다! 내 컴퓨터 모델을 외래 키 필드와 메모리 개체 수 필드를 다시 작성 하시겠습니까? 그런 다음 ManyToMany API 기능을 사용할 수 없습니다. 도움!

답변

6

편집 : 죄송합니다. '게시판'을 사용하지 않으려는 게시자의 게시물을 읽지 않았습니다.

이 문제를 피하는 한 가지 방법은 다차원 관계에 사용할 중간 모델을 수동으로 지정할 수있는 "through"매개 변수를 사용하는 것입니다. 이런 식으로 장고가 제공하는 다 대다 (대다수) 기능을 여전히 유지해야한다. 더 자세한 정보는

class Memory(models.Model): 
    partNum = models.CharField() 
    capacity = models.CharField() 

class Computer(models.Model): 
    name = models.CharField() 
    memory = models.ManyToManyField(Memory, through='ComputerMemory') 

class ComputerMemory(models.Model): 
    memory = models.ForeignKey(Memory) 
    computer = models.ForeignKey(Computer) 
    count = models.IntegerField() 

장고 설명서를 살펴 걸릴 :

중간 모델은 다음 (I 여러 관계를하는 것보다 쉽게 ​​관리 할 찾아 낼 것입니다) 수를 가질 수 https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

+0

감사합니다. 이것은 내가 생각하는 최고의 타협이다. –

0

없음을 이것은 타협이 아니다. 비록 당신이 통과를위한 또 다른 테이블을 만들지 않는다고해도, 장고는 각 컴퓨터와 연결된 메모리를 정확하게 기억하기보다는 그것을 만들 것이므로, 스스로하는 것이 더 좋다. 특정 컴퓨터가있는 특정 필드에 다른 필드가 필요합니다. mory

+1

나는 동의하지 않는다. 왜 장고가 비 고유 m2m 관계 만 허용 할 수 없습니까? –

+0

좋아 ... 그걸 물으면 ... 그냥 말해 ... 어떻게 그게 무엇과 관련된 추적 할 것인가 ?? 그 정보를 어딘가에 저장하고있다 .... 그래서이 기술을 사용한다. –

+0

그리고이 방법에 익숙하지 않다면 .... 사용자 정의 SQL을 매우 잘 사용할 수있다. –