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 存储表,具有可选的parent属性,可用于将记录分组在一起并优化某些搜索。在这种情况下,当我们想为用户添加几个别名时,它非常有用。

# 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 之外,还有什么想法吗?

4

0 回答 0