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 静态文件(带白噪声)

在 Django 网站上找不到页面 404?

在 Django 频道上找不到路径

示例教程在 Django 3 上找不到页面错误

在此服务器上找不到请求的 URL。引荐页面上的链接似乎错误或过时

Django 在服务器上找不到静态文件,但在本地机器上工作正常