2013-06-11 2 views
0

외래 키와 관련된 다른 모델의 모델 인스턴스를 여러 개 만드는 방법은 무엇입니까? 아래 예제 코드 :다른 모델에서 여러 모델 인스턴스 만들기?

import itertools 

class Table(models.Model): 
    color = models.CharField(max_length=100, blank=True, default='') 

    def create_chairs(self, num, style): 
     for _ in itertools.repeat(None,num): 
      c = Chair(style=style, table=self) 


class Chair(models.Model): 
    style = models.CharField(max_length=100, blank=True, default='') 
    table = models.ForeignKey('Table') 

4 개 의자가있는 테이블 객체를 생성 할 t1 = Table(color="blue", create_chairs={"style": 'natural', "num": 4})를 사용하려고합니다. models.py는 이와 같은 논리를 포함해야합니까, 아니면 모두 views.py에서 수행해야합니까?

+0

'create_chairs = { "style":'natural ', "num": 4}'란 무엇입니까? 어떻게 작동합니까? –

+0

그것은 테이블 클래스의 메서드로되어 있으므로 내 테이블 개체에서 호출 할 수 있습니다. – user1347648

답변

0

create_chairs()은 속성이 아니라 메소드입니다. 다음과 같이 테이블 및 의자를 만들 수 있습니다.

t1 = Table(color="blue") 
t1.create_chairs(4, 'natural') 

예,이 관계형 논리는 모델에 속합니다. 이제이 모든 가구를 저장

for _ in range(num): 

다른 단계 : 그런데, for 문으로 대체 할 수있다. 각 엔터티를 만든 후에는 put()이 필요하므로 프로그램이 끝난 후 존재하게됩니다.

1

현재 방법의 한 가지 문제점은 의자를 만들고 있지만 아무것도 지정하지 않아서 테이블이없는 의자가 있다는 것입니다.

장고이 알아서 할 수있는 내장을 제공합니다, 그래서 당신은 특정 방법이 필요하지 않습니다 : 별도의 방법으로이 작업을 수행 할 경우에이를 추가 할 수

t1 = Table(color='Blue') 

chairs = [Chair(style=y) for y in ['Natural']*4] 
for chair in chairs: 
    t1.chair_set.add(chair) 

당신의 맨 마지막에 models.py, 모든 클래스의 외부 는 : 그들은 말했다

def musical_chairs(table, num_chairs=4, style='Normal'): 
    chairs = [Chair(style=s) for s in [style]*num_chairs] 
    for chair in chairs: 
     table.chair_set.add(chair) 
+0

별도의 방법으로이 작업을 수행하고 싶지만 왜 내 테이블 클래스에 포함시킬 수 없습니까? 그리고 내가 그것을 추가했다면 어떻게 t1.musical_chairs (4)라고 불릴까요? 그리고 이전에 [style] * num_chairs에서 [Chair (style = s) s의 구문을 보지 못했습니다. 문서의 어딘가에 연결할 수있어서 그것에 대해 읽을 수 있습니까? – user1347648

+0

파이썬을 코딩 할 때 이해해야 할 핵심 사항입니다. Google 검색에는 수많은 소스가 있습니다. 또한 Table 클래스에 넣을 수 있습니다. self를 위해서'table'을 바꾸어야합니다. –

+0

테이블 클래스에 넣으면 django의 일부로 이미 사용할 수있는 기능을 다시 만듭니다. 이것은 나쁜 생각입니다.하지 마십시오. 사실 별도의 메소드로 사용해서는 안됩니다. 이미 제공된 메소드에 비해 구문 설탕 일 뿐이며 매우 간결합니다. –

1

으로. create_chair가 model attribute이 아닌 method 인 경우 Table 모델의 instance/object을 작성해야하므로 새 chairs을 추가해야합니다.

t1 = Table.objects.create(color="blue") 
t1.create_chairs(style='natural', num=4) 

는 그리고 당신은 save() 물마루 create() 방법을 만들기 위해 귀하의 방법을 변경해야합니다.

def create_chairs(self, num, style): 
    for _ in itertools.repeat(None, num): 
     Chair.objects.create(style=style, table=self) 
+0

이것은 조금 더 나아졌지만 디버거에서 무결성 오류 : myapp_chair.table_id가 null이 아닐 수 있습니다. "자체"참조를 전달하는 데 문제가 있습니까? – user1347648

+0

무결성 오류가 해결되었습니다. create_chairs를 호출 할 때 num 인수를 지정하는 것을 잊었습니다. 나는 이해하기 쉽기 때문에 대답의 단순함을 좋아합니다. 감사. – user1347648

+0

좋아요! 나는 너를 기꺼이 도와 준다. :디 –

관련 문제