我有一个模型形式:
class UserPreferencesForm(ModelForm):
"""
Form for storing user preferences.
"""
class Meta:
model = UserPreferences
exclude = ('user')
模特:
class UserPreferences(models.Model):
"""
Model for user project preferences.
"""
user = models.OneToOneField(User)
...
并在视图中:
...
form = UserPreferencesForm(request.POST or None)
if form.is_valid():
# save the form
prefs = form.save(commit=False)
prefs.user = request.user
prefs.update()
messages.add_message(
request, messages.INFO, 'Your preferences have been updated.'
)
...
我想确保每个用户只有一组首选项,所以我想重构视图代码以使用update()
模型方法的内容,而不是检查对象是否存在然后保存,这将产生更多的疑问。
“创建或更新”模型的最有效方法是什么?
任何帮助都非常感激。
答案 0 :(得分:1)
您是否有兴趣保存查询以检测是否存在行?
在这种情况下,您可以按照您的描述进行操作..执行更新并检查是否更新了0行,这意味着配置文件不存在。
updated = Preferences.objects.filter(user=request.user).update(**form.cleaned_data)
if updated == 0:
# create preference object
但更简单的设计模式是确保通过models.signals.post_save
类发送的User
信号监听每个用户始终有一个偏好表。
然后,您可以假设它始终存在。
def create_prefs(sender, instance, created, **kwargs):
if created:
# create prefs
models.signals.post_save.connect(create_prefs, sender=User)