这个问题类似于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之外的任何想法?