如何在查询中管理并发?

时间:2018-07-20 00:41:40

标签: python django database transactions django-rest-framework

我有此代码:

apples, oranges and pears

因此,我们的想法是仅在用户之前不喜欢餐厅的情况下创建一个新的LikedSlot,但我遇到了竞争问题,因为如果两个请求同时到达,则在第一行中会有两个请求if LikedSlot.objects.filter(restaurant__id=r.id, user__id=u.id).count() == 0: l = LikedSlot.objects.create(restaurant=r, user=u) 时间。

我尝试了以下操作,但似乎也无法解决问题:

True

您有解决办法吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,建议您使用数据库的参照完整性。更改您的模型,以使resturant + user对是唯一的:

class LikedSlot(models.Model):
    ...
    class Meta:
        unique_together = ('restaurant', 'user',)

这样,数据库将防止创建重复的记录。

进行此更改后,您还可以使用内置的get_or_create函数来代替自己检查重复项:

liked_slot, created = LikedSlot.objects.get_or_create(restaurant=r, user=u)