如果父模型不存在,则仅从可见字段更新

update only from's visible fields if parent model doesn't exist

我有继承自用户的 django 模型:

models.py

class UserProfile(User):
  birth_date = models.DateField()
  bio = models.TextField(null=True)
  ...

forms.py:

class UserProfileForm(forms.ModelForm):
  birth_date = forms.DateField()
  class Meta:
    model = UserProfile
    fields = ('first_name', 'last_name', 'birth_date', 'bio')

所以我在数据库中有 2 个表:

我只需要更新或创建(如果它们不存在)在我的表单中指定的原始文件。 SQL 看起来像:

UPDATE auth_user 
SET first_name=form_first_name, last_name=form_last_name
WHERE id = request.user.id

IF EXISTS (SELECT * FROM user_profile WHERE user_ptr_id = request.id)
  UPDATE user_profile 
  SET (birth_date = form_birth_date, bio = form_bio)
  WHERE user_ptr_id=request.id
ELSE
  INSERT INTO user_profile (user_ptr_id, birth_date, bio)
  VALUES (request.user.id, form_birth_date, form_bio )

理论上应该是这样的:

user_profile = UserProfile.objects.get(pk=request.user.id)
form = UserProfileForm(request.POST, instance=user_profile)

但是如果数据库中没有原始文件,它会抛出异常。有没有办法完成它?或者我只需要进行多次检查?

如果我没看错你应该使用 get_or_create (see docu)

user_profile = UserProfile.objects.get_or_create(pk=request.user.id)

此外,您需要从 AbstractBaseUser 而不是 User 派生。

class UserProfile(AbstractBaseUser):
       birth_date = models.DateField()
       ....

查看 Specifying a custom User model 的文档。