15

私にはうまくいく方法がありますが、それは非常に不器用なようで、これを行うためのより良い方法があると思います。

自分のサイトのユーザー(学習目的のT​​witterクローン)を他のユーザーのリストに関連付けるモデルがあります。

今、新しいユーザーを作成するときに、そのユーザーをリストのメンバーとしてリストを初期化します。

私のモデルは:

class FollowerList(models.Model)
    follower = models.ForeignKey(User,related_name="follower")
    followed = models.ManyToManyField(User,related_name="followed")

私が今使用している私の見解のコードは

user = User.objects.get(username=uname)
flst = FollowerList()
flst.follower = user
flst.save()
flst.followed.add(user)
flst.save()

二度呼び出さずにこれを作成する方法があるはずだsave()と私には思えますが、ドキュメントや他の場所でそれを見つけることができないようです。

4

3 に答える 3

15

many2many.add()の後にsaveを呼び出す必要はありません

コードを2行に短縮することもできます。

flst = FollowerList.objects.create(follower=user)
flst.followed.add(user)
于 2010-12-23T05:14:27.173 に答える
4

虎杖の答えは正解です。保存されるまで、M2Mフィールドにオブジェクトを追加することはできません。ただし、インスタンスを作成するためのより短い方法について説明したいと思います。

user = User.objects.get(username=uname)
flst = FollowerList(follower=user) #use key word args to assign fields
flst.save()
flst.followed.add(user)
# don't need to save after adding an object to many to many field.

空のインスタンスを作成してフィールドを割り当てるよりも、構文の方が少し優れていることがわかりました。ただし、objects.create()メソッド(Yukiが言及)はさらに優れています。

于 2010-12-23T12:10:41.197 に答える
2

これに対する遅い答え__init__:次のようにコンストラクター( )をオーバーライドすることもできます:

class FollowerList(models.Model):
    follower = models.ForeignKey(User,related_name="follower")
    followed = models.ManyToManyField(User,related_name="followed"

    def __init__(*args, followed=[], **kwargs):
        super(FollowerList, self).__init__(*args, **kwargs)
        self.save()
        for user in followed:
            self.followed.add(user)

followedつまり、ここでは、関数内のキーワード引数を明示的に処理し、他のすべてをデフォルトのコンストラクターに__init__渡しました。の呼び出しは、オブジェクトが登録されており、m2m関係で使用できることを確認します。argskwargssave

FollowerListこれにより、たとえば1行で作成できます。

flst = FollowerList(follower=user, followed=[user,])

あるいは、ヨハネスが指摘したように、モデルをに保存すること__init__は期待されていません。推奨されるアプローチは、メソッドを作成することです。詳細については、 httpsManager://docs.djangoproject.com/en/1.9/topics/db/managers/を参照してから、 : を作成してください。FollowerList

fl = FollowerList.objects.create(*args, followed, **kwargs)
于 2015-02-07T13:56:20.290 に答える