【问题标题】:ModelForm add the primary ID for an entry in table based on last entry's primary IDModelForm 根据最后一个条目的主 ID 为表中的条目添加主 ID
【发布时间】:2019-12-05 23:28:35
【问题描述】:

我正在创建一个注册系统。我正在使用 django 的默认用户模型来存储用户详细信息,并且我将其对象传递到一个名为“员工”的模型中,其中存储了他们的部门、经理和其他信息。这是我所拥有的。

models.py:

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user')
....

forms.py:

from users.models import Employee
from django.contrib.auth.models import User
from django.forms import ModelForm
from django.contrib.auth.forms import UserCreationForm


class AddNewUserForm(UserCreationForm):

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')


class AddNewEmployeeForm(ModelForm):

    class Meta:
        model = Employee
        fields = {'department', 'manager', 'total_leaves'}

add_new_user.html:

<form method="POST">
    {% csrf_token %}
    {{ form_user.as_p }}
    {{ form_emp.as_p }}

       <div class="text-center">
          <button type="submit" class="btn btn-success">Submit</button>
       </div>
  </form>

这就是我在views.py中处理数据的方式:

class AddNewUser(TemplateView):
    template_name = 'LMSAdmin/add_new_user.html'

    def get(self, request, *args, **kwargs):
        form_user = AddNewUserForm()
        form_emp = AddNewEmployeeForm()
        return render(request, self.template_name, {'form_user': form_user, 'form_emp': form_emp})

    def post(self, request):
        form_user = AddNewUserForm(request.POST)
        form_emp = AddNewEmployeeForm(request.POST)

        if form_user.is_valid():
            emp_info = form_emp.save(commit=False)
            emp_info.leaves_taken = 0
            emp_info.user = form_user.save()
            emp_info.save()
            messages.success(request, "Success!")
       else:
           messages.error(request, form_user.errors)
           messages.error(request, form_emp.errors)

       return redirect("add_new_user")

问题是当 post 方法运行时,它会尝试从头开始向Employee 表添加条目;假设其中没有条目。但我在该表中有条目,我收到以下错误:

重复键值违反唯一约束“users_employee_pkey” 详细信息:键 (id)=(6) 已存在。

它给了我这个错误,因为我的表中已经有 6 个用户。在此之后,当我第 7 次尝试使用此表单创建用户时,它可以工作。有没有办法查看表中有多少条目并自动将其增加 1 以避免此错误?

【问题讨论】:

    标签: django django-models django-forms django-class-based-views


    【解决方案1】:

    您可以手动设置自己的主键字段

    class Employee(models.Model):
        employee_id = models.IntegerField(primary_key=True)
    

    然后您可以在保存过程中计算和设置主键。只需获得最大的条目。 employee_id 并将其增加 1。例如:

    from django.db.models import Max
    
    # double underscores in employee_id__max
    max_employee_id = Employee.objects.all().aggregate(Max('employee_id'))['employee_id__max']
    

    【讨论】:

    • 这是有道理的。我会尝试一下,但我有一个问题。 django 默认不强制主键吗?
    • 没关系,我明白你的意思。我不知道为什么我之前没有想到。非常感谢!
    • 很高兴能帮到你!为了完整起见,如果有人偶然发现了同样的问题。 "您可以通过在字段中添加关键字 arg primary_key=True 来创建自己的主键字段。如果您添加自己的主键字段,则不会添加自动的。"
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2011-04-17
    • 1970-01-01
    • 2012-04-25
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多