2017-01-08 12 views
0

この問題は何度か起きましたが、私は別の理由からそれを得ていると思いますが、少なくともそれがどのように関連しているかはわかりません。Django - 割り当てることができません、インスタンスでなければなりません

ジャンゴ:1.10.5、Pythonの:3.5.2、Postgresでは:だから9.5

、私が持っているようなモデル(簡体字):

class ChildQuerySet(models.query.QuerySet): 

    def find_recent(self): 
     return self.order_by('-date_created') 

Child.objects = ChildQuerySet.as_manager() 

class Parent(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    date_created = models.DateTimeField(auto_now=True) 

class Child(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    date_created = models.DateTimeField(auto_now=True) 
    parent = models.ForeignKey(Parent) 

    def __init__(self, parent, *args, **kwargs): 
     super(Child, self).__init__(*args, **kwargs) 
     self.parent = parent 

私は、カスタムクエリセットを持っています

その後、私は子供のためのいくつかのカスタムクエリセットのメソッドをテストしようとしている:

class ChildQuerysetDatabaseIntegrationTest(TestCase): # from django.test 
    default_parent = Parent() 

    def setUp(self): 
     super(ChildQuerysetDatabaseIntegrationTest, self).setUp() 
     self.default_parent.save() 

    def test_find_recent(self): 
     # given 
     for _ in range(1, 10): 
      child = Child(self.default_parent) 
      child.save() 

     # when 
     recent = Child.objects.find_recent() 
     ordered = Child.objects.order_by('-date_created') 

     # then 
     self.assertEqual(list(ordered), list(recent)) 

これはテスト(すべてのエンティティをフェッチ)の最後の行に次のエラーを生成します、いくつかのマッピング・エラーがあるとき

ValueError: Cannot assign "UUID('...')": "Child.parent" must be a "Parent" instance. 

は通常、エラーが実体セーブ中にスローされますが、ここではすべてが正常に永続化するようです検索に失敗します。

親インスタンスに割り当てようとしているUUIDオブジェクトは、実際には子のIDオブジェクトであり、私をさらに混乱させます。

オブジェクトの作成をParent.objects.create()に変更しようとしましたが、結果は変更されませんでした。 ordered.first()のようなChildオブジェクトを取得する関数を呼び出すこともできないので、何が起こっているのか分かりません。

+1

'find_recent'はバニラではないので、あなたが明らかにマネージャのコードを表示する必要があります(' find_recent'のコードのように)。 – jknupp

答えて

1

問題はChildのカスタムコンストラクタです。 ORMが結果を取得しようとするとき、オーバーライドされたコンストラクタは、ORMが列値を渡すのを防ぎ、インスタンスを適切にインスタンス化します。

Child(parent, . . .) 

:カスタムコンストラクタは値を次の順序で渡されることを期待しながら、他の言葉では、ORMは、例えば、列が指定した順序で値を渡すために

Child(id, date_created, parent) 

をしようとしていますこの問題を解決するには、カスタムコンストラクタを削除し、親を持つ子を初期化するときはいつでも、

instance = Child(parent=parent) 

を使用してください。

関連する問題

 関連する問題