2012-12-30 3 views
2

에서 선택한 내가 밖으로 전송되는 각 메시지를 추적해야하는 경우 등 누구에... 내가 메시지를 보내고있다 SQL

그래서 나는받는 사람이 메시지 외의 여분의 테이블 모델에서, 새로운 메시지를 작성할 때마다 수신자를 채워야합니다. 메시지의 Recipient은 보내려는 모든 현재 전자 메일 주소가 들어있는 세 번째 모델에서 채워집니다.

내 질문에 가장 효율적인 방법에 대해 어떻게 생각하니?
은 내가 비슷한 할 수있는 알고

m = Message.objects.create(*args) 
for email in ModelWithEmails.active.values_list('email', flat=True): 
    Recipient.objects.create(message=m, email=email) 

을하지만 여전히 데이터베이스에서 모든 전자 메일 주소를 받고 포함하고 내가 가능한 경우로, 데이터베이스의 그 모든 내부를 유지하고 싶습니다 매번 가져올 수천 개의 주소가 있습니다.

답변

3

당신은 장고 ORM과 SELECT ... INSERT 할 수 없습니다,하지만 당신은 (장고 1.4 이후) 대량 삽입 작업을 수행 할 수 있습니다

m = Message.objects.create(*args) 
recipients = [] 
for email in ModelWithEmails.active.values_list('email', flat=True): 
    recipients.append(Recipient(message=m, email=email)) 

Recipient.objects.bulk_create(recipients) 

  또는보다 효율적인 작은 비트 :

m = Message.objects.create(*args) 
emails = ModelWithEmails.active.values_list('email', flat=True) 
Recipient.objects.bulk_create([Recipient(message=m, email=email) for email in emails]) 
INSERT를 들어

 

.. 다시 원시 SQL로 떨어질해야합니다 선택합니다.

+0

감사합니다. 내가 원하는 것은 아니지만 추상화 레이어를 사용하는 데있어서 단점이 있습니다. :) – gaqzi

1

장고 ORM은 더 이상 raw SQL을 사용할 필요가 없습니다. 매우 편리하지만 매우 유연하지는 않습니다. ORM을 사용하려면, Pavel Anossov가 말한 것처럼 bulk_create가 여러분의 친구가 될 것입니다.

관련 문제