2017-11-30 1 views
0

私のDjangoアプリケーションで作成された各ユーザにpositionパラメータを割り当てたいとします。位置はラインの下の様々なポイントで変更されますが、ユーザーが作成されるときには、次の最高値に設定する必要があります。モデルの次の値を安全にオブジェクトに与える方法 - Django

次のようにモデルがある:

from django.contrib.auth.models import User 
from django.db import models 

class Profile(models.Model): 
    user = models.OneToOneField(User) 
    position = models.PositiveIntegerField(null=False, default=0, unique=True) 

次のように私は、このパラメータを割り当てています現時点では:

user_count = User.objects.all().count() 
new_user = User() 
new_user.profile.position = user_count + 1 
new_user.save() 

二人のユーザが同時に登録されている場合は明らかに、そこです同じ値のuser_countが割り当てられる可能性があります(保存が行われる前に発生した場合)。一意性の制約があると、エラーが発生しますが、安全に解決する方法がわかりません。

一意性を保証するために、どうやってこれを行う必要がありますか(発生する固有の競合に対処するには)?

答えて

3

私はコメントするのに十分なポイントがありません、または私はそれを行うでしょう。選択したDBに応じて、他の列を追加するときに設定される自動インクリメント列を持つこともできます。また、その列を一意に設定し、エラーをキャッチして位置を増やすために、文でtry/exceptを使用することもできます。

関連する問題