1

我是 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() 的内容,但我并没有完全理解它的作用。这是我在忙于在仓库中寻找产品时用来将第一个产品“锁定”给第一个用户的东西吗?

在某种程度上,我试图在用户对其执行操作时将查询集中的单个记录分配给用户,并且仅在事务不成功时才使该对象再次可供其他用户使用。

4

1 回答 1

1

这真的行不通。它只是从 QuerySet 中提供相同的产品,并将其分配给当前访问该 url 的所有用户

此视图不会更改它选择的产品的 already_picked 属性,因此这将向所有人显示相同的产品。

我读过一些关于 Django 函数 select_for_update() 的内容,但我并没有完全理解它的作用。这是我在忙于在仓库中寻找产品时用来将第一个产品“锁定”给第一个用户的东西吗?

对,那是正确的。select_for_update() 可用于在将行标记为被选中时将它们锁定一小段时间。还要注意那个函数的skip_locked参数,它可以用来告诉数据库如果选择遇到一个锁定的行,它应该跳过它而不是等待行变得可用。

于 2022-02-23T22:59:38.027 回答