2012-12-20 2 views
16

을 참조 나는 다음과 같은 코드를 가지고 :이 방법의 두 가지 모델이 서로 장고

class Game(models.Model): 
    title = models.CharField(max_length=50) 
    summery = models.CharField(max_length=500) 
    key = models.IntegerField() 
    pin = models.CharField(max_length=12) 
    complete = models.BooleanField() 
    invite_sent = models.DateTimeField() 
    on = models.ForeignKey(Member, blank = True) #<---- 


class Member(models.Model): 
    email = models.CharField(max_length=100) 
    color = models.CharField(max_length=11) 
    game = models.ForeignKey(Game) #<---- 

다음은 멤버 중 하나에 외래 키 링크 (의는이 켜있는) "의". 게임의 모든 구성원은 게임에 설정된 "게임"외래 키를 갖습니다. 문제는 Django가 선언되기 전에 클래스를 참조하도록하지 않기 때문에 동시에 선언 할 수 없기 때문입니다 ...

편집 : 다음은 예제입니다. 한 명의 게임을하는 5 명의 멤버가있는 경우, 모두 5 명이 게임에 대한 외래 키를 갖게됩니다. 반면에 게임은 그것을 돌리는 특정 회원에게 하나의 외래 키를 가질 것입니다.

+3

여기에 적절하지 않을 수도 있지만, 일반적으로, 당신은 당신의 이름을 전달하여 아직 선언하지 않은 클래스에 대한 외래 키를 만들 수 있습니다 클래스 자체 대신에 문자열로서의 클래스. – mipadi

답변

29

Django documentation for the ForeignKey field 상태 : 아직 정의되지 않은 모델에 관계를 만들어야하는 경우

, 당신은 모델이 아닌 모델 객체 자체의 이름을 사용할 수 있습니다.

귀하의 경우 그래서

, 그는 다음과 같습니다

class Game(models.Model): 
    # Other fields... 
    on = models.ForeignKey('Member', blank = True) 

class Member(models.Model): 
    # Other fields... 
    game = models.ForeignKey(Game) 
+2

저에게'ForeignKey','OneToOneField','ManyToManyField'에'app.model '표기법을 사용하는 것은 아주 좋은 습관입니다. 모델 파일을 모델별로 하나의 파일로 분리하는 데이 방법을 사용했습니다. –

+0

@SteveK 이것은 순환 수입 문제를 해결하는 데 도움이되었습니다. 감사합니다! – OrPo

+0

'null = False' 기본 인수가 주어지면이 관계를 저장하는 방법은 무엇입니까? – jozxyqk

8

두 모델이 외래 키로 서로 참조 할 필요는 없습니다. 게임이 더있을 수있는 반면,

on = models.ForeignKey(Member, blank = True) #<---- 

하고 논리적으로 Member의 '는의가 여전히 다른 Game로 연결됩니다'의 (그리고 회원이 한 번에 하나 개의 게임에 속할 수 있기 때문에이 더 의미 : 라인을 제거 한 회원보다).

reverse relation을 사용하여 특정 게임에 속한 멤버를 파악할 수 있습니다.

+1

나는 내 상황을 분명하게 만들지 않았을 가능성이있다. 5 명의 모든 멤버가 한 게임을하는 순간에 모두 동일한 게임을 참조하게됩니다. 그러나 "외"키는 그것을 돌리는 사람들 (단원)을 참조 할뿐입니다. –

관련 문제