ManyToManyFiledを含む箇所のユニットテストを通す

結論

オブジェクトのidを渡せばよかった

こんなコード

ダミーです。BaseTestの部分はだいたいunittestを継承している軽いクラスです(といってもおれが実装できるはずもない)

class HogeAPItest(BaseTest):
    """あるAPI"""
    def setUp(self):
        super(HogeAPItest,self).setUp()

    def testHoge(self):
        """実際のテスト"""
        #ダミーデータ作成
        author = Author.objects.create(id=100, name="hoge")
        book = Book.objects.create(id=100)
        book.client.add(author)
        book.save()
        #ここのmanytomanyの部分がManyToManyFieldな部分なので、idを渡してやる。
        response = self.client.post("/api/hoge/create", {"title":"string", "id": 100, "manytomany": book.author.get(id=100).id,
                                                                 "arg1": "string",
                                                                 "arg2":"string",
                                                                 })
        #レスポンスのステータスコードが200になるテスト
        self.assertEqual(response.status_code, 200)
        #不要なテストデータを消す
        author.delete()
        book.delete()
        Book.objects.filter(id=100).delete()

こういうテストを通した。で、この「manytomany」の部分が実際はmodels.ModelだとManyToManyFiledのものです。
で、このときforms.ModelFormで生成されたFormを通すために form.is_valid()している。
ちなみにこの問題はForienkeyでも同じかもしれない。Djangoドキュメントには(devを見ても)載ってないっぽい。

探し方

公式ドキュメントによるとManyToManyFieldでforms.ModelFromで生成されるのはMultipleChoiceFieldとある。ドキュメントには載ってないのでソースをさがすしかない。
ソースだmodels.pyとfields.pyの両方に記述があって、models.pyの方でよくみるとcleanメソッドの中で 'pk' を参照している。 pk = id と考えるとidを渡すのが妥当ということになる。

thx

@xxxxxxxxxxxxxxxxx ++
ほんと結局全部教えてもらっちゃってごめんなさいすいませんありがとうございますおれはクソすぎるもうだめだ死のう……