这个问题类似于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 之外,还有什么想法吗?