1

我有一个模型:

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()模型方法中的某些内容,而不是检查对象是否存在然后保存,这会导致更多查询。

“创建或更新”模型的最有效方法是什么?

非常感谢任何帮助。

4

1 回答 1

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)
于 2013-01-14T22:12:57.143 回答