如果父模型不存在,则仅从可见字段更新
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 个表:
- auth_user (id, 用户名, first_name, last_name, ...)
- user_profile(birth_date, 简历, user_ptr_id)
与
one to one
关系。
我只需要更新或创建(如果它们不存在)在我的表单中指定的原始文件。 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 的文档。
我有继承自用户的 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 个表:
- auth_user (id, 用户名, first_name, last_name, ...)
- user_profile(birth_date, 简历, user_ptr_id)
与
one to one
关系。
我只需要更新或创建(如果它们不存在)在我的表单中指定的原始文件。 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 的文档。