Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
Python Django表单在生产和LH上找不到正确的ID int增量_Python_Django_Django Forms_Modelform - Fatal编程技术网

Python Django表单在生产和LH上找不到正确的ID int增量

Python Django表单在生产和LH上找不到正确的ID int增量,python,django,django-forms,modelform,Python,Django,Django Forms,Modelform,由于某些原因,在Localhost(LH)上,一切正常,但在我的生产服务器上,我的表单没有正确添加新用户提交。我得到的错误是: duplicate key value violates unique constraint "..." DETAIL: Key (id)=(8) already exists. 是否需要运行某种生产“sudo systemctl restart gunicorn”(我已经尝试过上面的示例)?也许它只是在LH上工作,因为我在那里测试了更多,增量自然与用户总数处于同一

由于某些原因,在Localhost(LH)上,一切正常,但在我的生产服务器上,我的表单没有正确添加新用户提交。我得到的错误是:

duplicate key value violates unique constraint "..."
DETAIL:  Key (id)=(8) already exists.
是否需要运行某种生产“sudo systemctl restart gunicorn”(我已经尝试过上面的示例)?也许它只是在LH上工作,因为我在那里测试了更多,增量自然与用户总数处于同一水平?我真的没有主意了

models.py

class Lead(models.Model):
    username = models.CharField(max_length=15, blank=True, null=True)
    email = models.CharField(unique=True, max_length=150, validators=[validate_email])
    created = models.DateTimeField(auto_now_add=True)
    ...
forms.py

class LeadCaptureForm1(forms.ModelForm):
    birth_date = forms.DateField(widget=SelectDateWidget(years=range(1999, 1910, -1)))

    class Meta:
        model = Lead
        widgets = {
            'email': forms.TextInput(attrs={'class': 'form-control'}),
        }
        fields = ('email', 'birth_date',)
views.py

def iframe1(request):
    ip = get_real_ip(request)
    created = timezone.now()

    if request.method == 'POST':

        form = LeadCaptureForm1(request.POST)
        if form.is_valid():

            # Save lead
            lead = form.save()
            # attempt at fixing it
            #lead.id = Lead.objects.get(all).count()
            #print(lead.id)
            lead.created = created
            lead.birth_date = form.cleaned_data.get('birth_date')
            lead.ipaddress = get_real_ip(request)
            lead.joinmethod = "Iframe1"
            lead.save()

            print(lead)

我不知道为什么要手动设置ID,尤其是为什么要将其设置为项目计数。您应该始终让数据库管理主键本身-它是一个自动增量字段,对您的数据完全不透明

出现此冲突的原因是可以删除项目,因此数据库中可能有8个条目,但ID 8已经存在。但就像我说的,不要这样做

另外,不要手动设置
已创建
,因为这也会自动完成,因为您在模型字段中有
auto\u now\u add=True
。。并且,
出生日期
已由表单save设置。最后,如果要手动设置一些其他字段,则应调用save with
commit=False

所以,只要做:

lead = form.save(commit=False)
lead.ipaddress = get_real_ip(request)
lead.joinmethod = "Iframe1"
lead.save()

这是因为我们手动上传了Lead,Django使用PostgreSQL的串行数据类型来存储自动递增的主键

序列列由跟踪下一个可用值的序列中的值填充。手动将值分配给自动递增字段不会更新字段的序列,这可能会在以后导致冲突

为了解决这个问题,我们可以强制一个新的序列号,或者构建一个异常来修复序列号。后一个选项将是理想的,因为我们可能在将来手动上传用户。不过,现在,我们将尝试强制使用序列号

Run code: python manage.py sqlsequencereset [app_name]
出于某种原因,这不起作用,所以我打算尝试并找出如何构建某种“python if豁免”,但首先找到了这篇帮助我直接更新“setval”的文章()


嘿,谢谢你看。注意到上面的代码,只是注释掉了该部分,因为这是一个修复的尝试。所以我添加了“(commit=False)”并且在生产中仍然存在相同的问题。奇怪的是它对LH有效
SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)