我是 Django 初学者,我正在尝试在 Django 中创建一个仓库管理系统。系统跟踪哪些产品进入仓库,因此知道仓库中有什么以及在哪个位置。
有几个用户(订单拣货员)同时登录并且必须从仓库中获取产品。
我的模型如下所示:
class Product(models.Model):
location = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(5000)])
already_picked = models.BooleanField(default=False, blank=True)
available_for_picking = models.DateField(blank=True, null=True)
def __str__(self):
return str(self.id)
必须在某一天从仓库中提取的产品必须满足多个条件。
例如:
- available_for_picking = 今天或过去的日期
和
- aldready_picked = False
我想做的事:
每个用户访问 url:www.mydomain.com/get_order_location_to_pick并获取他必须从仓库提取的产品的位置。
但是,有几种产品符合选择标准,并且有多个用户同时使用该软件。所以我想避免将相同的产品(和位置)分配给超过 1 个用户。当用户拿走产品后,布尔值“already_picked”应从 False 更改为 True。如果用户由于某种原因无法从仓库中取回分配给他的产品,则当他/她访问相同的 url www.mydomain.com/get_order_location_to_pick时,该产品必须分配给另一个用户
有什么好方法可以做到这一点?
在我看来,我目前有这个:
@login_required(login_url='login')
def get_order_location(request):
products_to_pick = Product.objects.filter(already_picked=False, available_for_picking__lte= datetime.now())
first_product_to_pick = products_to_pick.first()
context = {
'first_product_to_pick' : first_product_to_pick
}
return render(request, 'show_the_order_to_pick.html', context)
这真的行不通。它只是从 QuerySet 中提供相同的产品,并将其分配给当前访问 url www.mydomain.com/get_order_location_to_pick的所有用户
我读过一些关于 Django 函数 select_for_update() 的内容,但我并没有完全理解它的作用。这是我在忙于在仓库中寻找产品时用来将第一个产品“锁定”给第一个用户的东西吗?
在某种程度上,我试图在用户对其执行操作时将查询集中的单个记录分配给用户,并且仅在事务不成功时才使该对象再次可供其他用户使用。