Django 表单在生产与 LH 上找不到正确的 ID int 增量
Posted
技术标签:
【中文标题】Django 表单在生产与 LH 上找不到正确的 ID int 增量【英文标题】:Django Form Does Not Find Right ID int Increment on Production vs LH 【发布时间】:2018-09-18 17:58:12 【问题描述】:由于某种原因,在 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)
【问题讨论】:
【参考方案1】:我不确定您为什么要手动设置 ID,尤其是为什么要将其设置为项目数。您应该始终让数据库自己管理主键 - 它是一个自动增量字段,并且对您的数据完全不透明。
您遇到此冲突的原因是可以删除项目,因此数据库中可以有 8 个条目,但 ID 8 已经存在。但正如我所说,根本不要这样做。
另外,不要手动设置created
,因为您在模型字段中有auto_now_add=True
。并且birth_date
已由表单保存设置。最后,如果您想手动设置一些其他字段,您应该使用commit=False
调用保存。
那就这样吧:
lead = form.save(commit=False)
lead.ipaddress = get_real_ip(request)
lead.joinmethod = "Iframe1"
lead.save()
【讨论】:
您好,感谢您的浏览。注意到上面的代码,只是注释掉了该部分,因为它是在尝试修复。所以我添加了“(commit = False)”并且在生产中仍然遇到同样的问题。奇怪的是它适用于 LH【参考方案2】:这是因为我们手动上传了线索,而 Django 使用 PostgreSQL 的 SERIAL 数据类型来存储自动递增的主键。
“SERIAL 列填充了来自跟踪下一个可用值的序列中的值。手动将值分配给自动递增字段不会更新字段的序列,这可能会在以后导致冲突。”
https://docs.djangoproject.com/en/2.0/ref/databases/#manually-specifying-values-of-auto-incrementing-primary-keys
为了解决这个问题,我们可以强制一个新的序列号或构建一个异常来修复序列号。后一种选择将是理想的,因为我们将来可能会手动上传用户。不过,目前,我们将尝试强制使用序列号。
Run code: python manage.py sqlsequencereset [app_name]
由于某种原因,这不起作用,所以我正要尝试弄清楚如何构建某种“python if exclude”,但首先找到了这篇文章(IntegrityError duplicate key value violates unique constraint - django/postgres),它帮助我直接更新了“设置”:
SELECT setval('tablename_id_seq', (SELECT MAX(id) FROM tablename)+1)
【讨论】:
以上是关于Django 表单在生产与 LH 上找不到正确的 ID int 增量的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上找不到 Django 静态文件(带白噪声)