2014-11-03 2 views
1

내가 다른 테이블의 외래 키로 많은 관계로 많은 사용하려고 해요,하지만 다음과 같은 모델 possible.Consider 경우 잘 모르겠어요 :장고 외래 키

from django.db import models 

class Attribute(models.Model): 
    name=models.CharField(max_length=30) 
    unit=models.CharField(max_length=30) 

class Protocol(models.Model): 
    name=models.CharField(max_length=30) 
    attributes=models.ManyToManyField(Attribute,db_table='protocol_attribute') 

class Device(models.Model): 
    serial_number = models.CharField(max_length=30) 
    id_protocol=models.ForeignKey(Protocol) 

class DeviceValues(models.Model): 
    id_device=models.ForeignKey(Device) 
    id_protocol_attribute=models.ForeignKey(Protocol.attributes) 
    value=models.IntegerField() 

나는 다음과 같은 오류가 나타납니다이 모델의 유효성을 검사 할 때 :

First parameter to ForeignKey must be either a model, a model name, or the string 'self' 

내가 모델 또는 첫 번째 매개 변수로 모델 이름을 사용하고 있지 않다 알고,하지만 난 외래 키로 방법을 참조 할 수 있습니다를 Django가 Protocol과 Attributes 사이의 매핑을 처리하도록 자동으로 생성하는 join 테이블?

가능한 해결 방법은 프로토콜을 외래 키로 Attribute 클래스에 추가 한 다음이 속성을 DeviceValue 클래스에 대한 foreing 키로 사용할 수 있습니다. 그러나 속성을 공유 할 프로토콜을 갖기 때문에 그렇게하고 싶지 않습니다. 각 프로토콜에 대한 속성을 반복하는 것이 아니라 조인 테이블을 만드는 것을 선호합니다.

모든 아이디어가 환영받을 것입니다 .... 감사합니다 !!!

알레한드로

+1

'Protocol.attributes.through'는 작동합니까? –

+0

그것은한다! !! 원래 m2m 관계에있는 것보다 더 많은 외래 키를 중간 테이블에 추가 할 수 없다는 것을 이해했습니다. 그러나 나는 그것을 시도하고 불평하지 않았다. 한 가지 고려해야 할 것은 SQL 파일의 3 개의 외래 키에 대해 UNIQUE 제약 조건을 생성하지 않기 때문에 수동으로 추가해야한다는 것입니다. – user3851205

답변

0

중간 테이블을 사용하여 해결했습니다. 이 모델은 결국 이렇게되었습니다.

from django.db import models 

class Attribute(models.Model): 
    name=models.CharField(max_length=30) 
    unit=models.CharField(max_length=30) 

class Protocol(models.Model): 
    name=models.CharField(max_length=30) 
    attributes=models.ManyToManyField(Attribute,through='DeviceValue') 

class Device(models.Model): 
    serial_number = models.CharField(max_length=30) 
    id_protocol=models.ForeignKey(Protocol) 

class DeviceValue(models.Model): 
    id_name=models.ForeignKey(Protocol) 
    id_attribute=models.ForeignKey(Attribute) 
    id_device=models.ForeignKey(Device) 
    value=models.IntegerField() 

한 가지 가치가 언급이 생성되지 않은 DeviceValue의 tablue의 세 외래 키에 대한 UNIQUE 제약 sqlall 사용하는 경우 그래서 난 그냥 데이터베이스를 작성하기 전에를 추가 한 것입니다.