【问题标题】:Django form.save() does not return a pk value, when pk is UUID当 pk 为 UUID 时,Django form.save() 不返回 pk 值
【发布时间】:2020-11-24 15:55:08
【问题描述】:

我在 Python 3.7.5、Django >=2.2.8、

class CustomUser(AbstractUser):
    objects = CustomUserManager()
    person = models.ForeignKey(
        'Person', on_delete=models.DO_NOTHING, null=True)

class Person(models.Model):
    uuid = models.UUIDField(primary_key=True, db_column='person_uuid')
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    address1 = models.CharField(max_length=255, blank=True, null=True)
    address2 = models.CharField(max_length=255, blank=True, null=True)
    add_date = models.DateTimeField(auto_now_add=True)
    mod_date = models.DateTimeField(auto_now=True)

下面显示的 CreateUser 视图用于注册新用户。此视图由 2 个表单组成,一个用户创建表单和一个人员表单。一旦用户输入他们的详细信息,我想保存 person_form 并将 CustomUser 中的人员字段设置为新创建的人员。但是保存后pk的值总是None。

为了解决这个问题,我使用匹配的 first_name 和 last_name 查询 Person 模型,并使用响应中的 UUID。但这非常脆弱,因为我有其他模型使用 UUID 并且没有像 first_name 和 last_name 这样的唯一值。我想知道是否有更可靠的方法来获取刚刚保存的表单的 UUID。

class CreateUserView(View):
    template_name = 'core/create_user.html'

    def get(self, request, *args, **kwargs):
        user_form = CustomUserCreationForm()
        person_form = PersonForm()
        context = {'person_form': person_form,
                   'user_form': user_form}
        return render(request, self.template_name, context=context)

    def post(self, request, *args, **kwargs):
        person_form = PersonForm(request.POST)
        user_form = CustomUserCreationForm(request.POST)
        print('Person form is valid: {}'.format(person_form.is_valid()))
        if person_form.is_valid() and user_form.is_valid():
            print('User form is valid')
            person = person_form.save()
            print(f'PK of new person is: {person.pk}')
            p = Person.objects.filter(first_name=person.first_name,
                                      last_name=person.last_name).latest('add_date')

            user = user_form.save(commit=False)
            user.person = p
            user.save()

            messages.success(request, 'Account created successfully')
            return redirect('login')

        else:
            return render(request, self.template_name, {'person_form': person_form,
                                                        'user_form': user_form})

注意:我意识到 Person 和 CustomUser 可以是一个单一的模型,但是 Person 在数据库的其他地方与其他实体一起使用,并且需要独立于用户

【问题讨论】:

    标签: python django forms model


    【解决方案1】:

    我知道这已经晚了,但您可能会发现 thisthis 很有趣。看来您没有得到任何回报,因为您的主键不是 AutoField。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2016-02-12
      • 2018-04-16
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多