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.'
        )
    ...

各ユーザーが 1 セットの設定のみを持つようにしたいので、ビュー コードをリファクタリングして、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 に答える