2016-09-27 89 views
1

考慮這個的Django代碼:檢查對象在DB(Django的)存在

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) 

如果什麼用戶從DB交易開始前刪除嗎?它會將不存在的用戶添加到group.users。這是一個錯誤。

在這種情況下如何保護數據庫完整性?

+0

@MosesKoledoye用戶是廣告通過Web界面。我不明白你:這與用戶的添加方式有什麼關係? – 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