0

この質問は、Django のアトミック操作に似ていますか? ただし、Django 1.4 の場合。「生のSQL」に頼らずにこれを行う方法があるかどうか疑問に思っています。私の設定は彼とは少し違うので、説明します。

UserのレコードとUserRecordsという汎用テーブルがあります。UserRecordの定義は次のとおりです。

class UserRecord (models.Model):
    """
    User record model for :class:`User` users to keep
    aux data like services connected, latest stats, and other accounts.
    """

    def __unicode__ (self):
        return u"{0}.{1}.{2}.{3}".format(self.user, self.parent, self.key, self.value)

    def update_maybe_save (self, val):
        if self.value != val:
            self.value = val
            self.save()

    #: :class`User` who owns this record
    user = models.ForeignKey("User")
    parent = models.CharField(max_length=255, blank=True, null=True, db_index=True)
    key = models.CharField(max_length=255, db_index=True)
    value = models.TextField(blank=True, null=True)

ご覧のとおり、これは非常に一般的な k/v ストア テーブルであり、オプションの属性を使用して、レコードをグループ化し、一部の検索を最適化するのに役立ちます。この場合、ユーザーにいくつかのエイリアスを追加したい場合に非常に便利です。

# Inside the User model
def add_alias (self, name):
    try:
        UserRecord.objects.get(user=self, parent="alias", key=name, value=self.username)
    except UserRecord.DoesNotExist:
        UserRecord(user=self, parent="alias", key=name, value=self.username).save()

これにより、競合状態が発生し、ユーザーが同じエイリアスを 2 回入力すると、2 つの同一のレコードが作成される可能性があります。次に、UserRecord.objects.get呼び出しが 2 つあるため、それぞれの呼び出しが失敗します。Django のエラー メールが届き、手動でデータベースを修正します。

ドキュメントには、アトミックに何かを作成できるものは何も見つかりません。他の質問で言及されている生のSQL以外のアイデアはありますか?

4

0 に答える 0