Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 分配唯一id以避免竞争条件_Django - Fatal编程技术网

Django 分配唯一id以避免竞争条件

Django 分配唯一id以避免竞争条件,django,Django,我有一个名为Vehicles的表单,每次用户完成一个表单时,我都会尝试为每个表单分配一个唯一的id class Vehicles(models.Model): id = models.DecimalField(primary_key=True, unique=True) 在我根据最后一条车辆数据库记录分配给id字段的初始值之后,试图避免竞争条件(当两个表格同时提交时),在保存表格之前,我再次向db查询最后一条记录的id。或多或少我是这样做的: def vehicle(request)

我有一个名为Vehicles的表单,每次用户完成一个表单时,我都会尝试为每个表单分配一个唯一的id

class Vehicles(models.Model):
     id = models.DecimalField(primary_key=True, unique=True)
在我根据最后一条车辆数据库记录分配给id字段的初始值之后,试图避免竞争条件(当两个表格同时提交时),在保存表格之前,我再次向db查询最后一条记录的id。或多或少我是这样做的:

def vehicle(request):
    vehicles= Vehicles.objects.all().order_by("-id")[0]
    id = vehicles.id+1

    if request.method == 'POST':
        form = VehiclesForm(data=request.POST)

        if form.is_valid():
            vehicles= Vehicles.objects.all().order_by("-id")[0]
            id = vehicles.id+1
            temp = form.save(new_veh_id=id)
            return render_to_response('success.html', locals(), context_instance= RequestContext(request))
    else:
        form = VehiclesForm(initial={'id': id})
    return render_to_response('insertVehicle.html', locals(), context_instance= RequestContext(request))
在表单中,我覆盖save方法:

    def save(self, *args, **kwargs):
        commit = kwargs.pop('commit', True)
        new_veh_id = kwargs.pop('new_veh_id', None)
        instance = super(VehiclesForm, self).save(*args, commit = False, **kwargs)

        if id is not None: instance.id = new_veh_id
        if commit:
            instance.save()
        return instance
但是is_valid返回false,表单错误:具有此id的车辆已存在。 我在另一个模型和表单(与这些相同的字段)中使用了这种做法,它像一个符咒一样工作,表单通过了验证,尽管id相同,但它在最后提交的表单中更改了它。有人能在这方面帮助我吗,或者建议一个更好的解决方案来实现这个功能吗?我所做的也许是某种“习惯”

编辑:我也试过了,但“是否有效”再次失败

    def clean(self):
        cleaned_data = super(VehiclesForm, self).clean()
        id = unicode(self.cleaned_data.get('id'))

        vehicles= Vehicles.objects.all().order_by("-id")[0]
        id = vehicles.id+1
        cleaned_data[id] = id

        return cleaned_data
我想你需要哪一个能把行锁到最后 交易记录。请注意,虽然它被指定与许多 行,您仍然可以只锁定一行,方法是确保您的
过滤器
查询
将只返回一个对象。

为什么要自己处理唯一值?考虑使用AutoField,我正在使用一个遗留的DB,所以恐怕这是不可能的,或者,在视图中,车辆=车辆。Objor。()。OrthyBy(“-ID”)[0 ] ID =车辆。ID + 1将无济于事。您必须在save()方法中进行修改。为了避免并发,这里给出了一些示例:是的,但为了达到save(),表单应该通过验证。但是,当两个表单同时从不同的用户提交时,ID是相同的,最后一个表单验证失败。这是我的问题。@marlen你考虑过了吗?