2016-09-27 8 views
1

このDjangoのコードを考えてみましょう:トランザクションを開始する前に、ユーザは、DBから削除された場合(ジャンゴ)オブジェクトがDBに存在することを確認する

class User(models.Model): 
    name = models.CharField(null=True, blank=False, verbose_name=_("Name"), help_text='User Name', max_length=256) 

class UsersGroup(models.Model): 
    name = models.CharField(null=False, blank=False, verbose_name=_("Name"), help_text='Users Group Name', max_length=256) 
    users = models.ManyToManyField(User) 

# ... 

with transaction.atomic(): 
    group.users.add(user) 

何?存在しないユーザーがgroup.usersに追加されます。これはエラーです。

DBの整合性を保つためにこの状況をどうしたらいいですか?

+0

@MosesKoledoyeユーザーは広告ですWebインターフェイスを介してded。私はあなたを理解していません:これはユーザーの追加方法とどのように関連していますか? – porton

答えて

1

その後、グループに追加するときにユーザーが存在しない場合クエリは次のようにメッセージでIntegrityErrorを発生させるデータベースで失敗します。

IntegrityError: insert or update on table "app1_usersgroup_users" violates foreign key constraint "app1_usersgroup_users_user_id_96d48fc7_fk_polls_user_id" 
DETAIL: Key (user_id)=(3) is not present in table "polls_user". 
0

あなただけtransaction.atomicブロックでGETを追加します。

with transaction.atomic(): 
    user = User.objects.get(name='stackoverflow') 
    group.users.add(user) 
0

あなたは同様にそれを処理するために例外を使用することができます。

try: 
     group.users.add(User.objects.get(name='Julian')) 
    except: 
     # handle the error - user doesn't exist 
関連する問題