2016-08-13 3 views
0

QオブジェクトのリストからM個のオブジェクトを取得し、M個のオブジェクトをユーザーにマップする必要があります。djangoトランザクションで複数のオブジェクトを作成するには?

def polls(request, template_name='polls/polls.html'): 
    question_list = random.sample(list(Question.objects.all()), 3) 
    try: 
     with transaction.atomic(): 
      for question in question_list: 
       UserToQuestion.objects.create(
        user=request.user.id, 
        question=question.id 
       ) 
    except IntegrityError: 
     handle_exception() 

が、私はこれを達成することができますどのようにこれを達成するために、私は、トランザクション内のコードを実行し、Mオブジェクトの1が作成されていない場合にはDBをロールバックする必要がありますか?例外の処理方法djangoのドキュメンテーションは、実際の例を示していません。

登録ユーザーがN個の質問にマッピングされるようにsaveメソッドをオーバーライドするユーザー登録の際に、このタスクを実行することもできます。

答えて

0

ユーザー登録時にdjango signalsを使用する必要があります。 また、with transaction.atomic():の部分は必要ありません。使用する必要があります bulk create

+0

をロードし、私はあなたの提案を追加し、質問を編集しますが、信号が – realnot

+0

検索をトリガされませんインターネットやgithub上の作業コードは、あなたが正しいことをしていない見てください。 –

+0

https://coderwall.com/p/ktdb3g/django-signals-an-extremely-simplified-explanation-for-beginners –

0

最初に、ユーザーが登録されたときに関連する質問をユーザーにマッピングするための信号を作成します。シグナルはpost_save()からトリガーされ、コールバック関数はN個のランダムな質問を検索し、ユーザーにマップします。シグナルは接続する必要があります。私たちはデコレータ@receiverを使用します。 bulk_create()メソッドの原因となるトランザクションも使用する必要があります。

signals.py

import random 

from django.dispatch import receiver 
from django.contrib.auth.models import User 
from django.db import transaction 
from django.db.models.signals import post_save 

from polls.models import Question, UserToQuestion 


@transaction.atomic 
@receiver(post_save, sender=User) 
def sig_user_registered(instance, **kwargs): 
    question_list = random.sample(list(Question.objects.all()), 3) 
    UserToQuestion.objects.bulk_create([ 
     UserToQuestion(user=instance, question=question) for question in question_list 
    ]) 

信号がインポートされなければなりません。これを行うために、ready()メソッドを使用します。

apps.py

from django.apps import AppConfig 

class AccountConfig(AppConfig): 
    name = 'account' 

    def ready(self): 
     import account.signals 

最後に、我々はアプリケーションに

settings.py

INSTALLED_APPS = [ 
    # Django apps 
    # ... 
    # Third-party apps 
    # ... 
    # Your apps 
    'account.apps.AccountConfig', 
    # ... 
] 
関連する問題