Django 1.4中的原子数据库操作

时间:2013-01-15 18:18:17

标签: django django-models atomic django-postgresql

这个问题类似于Atomic operations in Django?但是对于Django 1.4。我想知道是否有办法做到这一点没有诉诸“原始SQL”。我的设置与他有点不同,所以我会解释。

我有用户的记录和名为 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()

这为竞争条件设置了自己,如果用户两次输入相同的别名,则可以创建两个相同的记录。然后每个UserRecord.objects.get调用失败,因为有两个,我得到一个Django错误电子邮件,我手动修复数据库。

我在文档中找不到允许我以原子方式创建内容的任何内容。除了在另一个问题中提到的原始sql之外的任何想法?

0 个答案:

没有答案