3

まず、プロジェクトをGoogle App Engineで実行することを計画しているので、私が知る限り、djangoのタイプをサポートしていないdjangoappengineを使用しています。ManyToManyFieldこのため、モデルを次のように設定しました。

from django.db import models
from django.contrib.auth.models import User

class Group(models.Model):
    name = models.CharField(max_length=200)

class UserGroup(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(Group)

ページには、グループ名を入力できるフォームフィールドがあります。このフォームフィールドの結果で、ユーザーとグループの組み合わせのUserGroupオブジェクトを作成し、グループがまだ存在しない場合は、新しいGroupオブジェクトを作成します。最初は、このロジックをメソッドを使用してUserGroupクラスに配置し始めましたが、これadd_groupをクラスに配置することは実際には意味がないことにすぐに気付きましたUserGroup。これを行う適切な方法は何でしょうか?モデルマネージャーについていくつか見ました。これは何のためですか?

4

1 に答える 1

3

Djangoドキュメントから:

Managerは、データベースクエリ操作をDjangoモデルに提供するためのインターフェイスです。

したがって、マネージャーはモデルの新しいインスタンスを作成する方法ではありません。

キーワード引数から(指定されている場合)Groupをプルして新しいを作成するモデルのコンストラクターが必要です。UserUserGroup

したがって、コンストラクターがキーワード引数を取り除き、それを使用して適切なものを作成できるため、 newGroupをインスタンス化した場合:Group(name='group name', user=some_user)userUserGroupuser

class Group(models.Model):
    name = models.CharField(max_length=200)

    def __init__(self, *args, **kwargs):
        # Remove user from the kwargs.
        # It is important that user is removed from the kwargs before calling
        # the super.__init__(). This is because the `user` kwarg is not expected.
        user = kwargs.pop('user', None)

        # call the normal init method
        super(Group, self).__init__(*args, **kwargs)

        # Create the UserGroup instance for the specified user
        if user is not None:
            # Maybe some other logic here ...
            UserGroup(user=user, group=self).save()

このようuserに、インスタンス化するときにを指定Groupすると、が作成され、それ以外のUserGroup場合は何も実行されません。

もちろん、UserGroupモデルのコンストラクターでも同様のことを行うことができます。それほど重要ではありません。コードにとってどちらが比喩的に意味があるかによって異なります。

編集:

コメントで指摘された問題の修正:

...
def __init__(self, *args, **kwargs):
    ...
    self._user_group = UserGroup(user=user, group=self)

def save(self, *args, **kwargs):
    super(Group, self).save(*args, **kwargs)
    self._user_group.save()
于 2011-01-01T04:48:13.990 に答える