Python Django表单在生产和LH上找不到正确的ID int增量
由于某些原因,在Localhost(LH)上,一切正常,但在我的生产服务器上,我的表单没有正确添加新用户提交。我得到的错误是: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上工作,因为我在那里测试了更多,增量自然与用户总数处于同一
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 withcommit=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)