Django 1.4中的原子数据库操作
这个问题与Django 1.4类似。我想知道是否有一种方法可以做到这一点,而不必求助于“原始SQL”。我的设置与他的稍有不同,所以我会解释 我有一个用户记录和一个名为UserRecords的通用表。下面是UserRecord的定义 如您所见,这是一个非常通用的k/v存储表,具有可选的父属性,可用于将记录分组在一起并优化某些搜索。在本例中,当我们要为用户添加几个别名时,它非常有用Django 1.4中的原子数据库操作,django,django-models,atomic,django-postgresql,Django,Django Models,Atomic,Django Postgresql,这个问题与Django 1.4类似。我想知道是否有一种方法可以做到这一点,而不必求助于“原始SQL”。我的设置与他的稍有不同,所以我会解释 我有一个用户记录和一个名为UserRecords的通用表。下面是UserRecord的定义 如您所见,这是一个非常通用的k/v存储表,具有可选的父属性,可用于将记录分组在一起并优化某些搜索。在本例中,当我们要为用户添加几个别名时,它非常有用 # Inside the User model def add_alias (self, name): try
# 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之外,还有什么想法吗?可能使用
unique\u=(“用户”、“键”),
@sneawo打算说不,但让我检查一下that@sneawo啊,明白了。我有一些用作多存储的父/键值。所以parent=“likes”,key=“brands”,value=[品牌名称]。如果unique_together=((“用户”、“家长”、“键”、“值”),
?@sneawo有点违背目的,因为在我只想要一条记录的情况下,这并不能防止重复
# 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()