2

私はtastypieとDjangoをセットアップしましたが、それらはうまく機能し、HTTPを介してオブジェクトをフィルタリングおよびパッチできます。

今、逆の関係で結果をフィルタリングしてみたいのですが、うまく機能しません。

つまり、私のDjangoモデルはそのようなものであり、各ライブラリオブジェクトにはマルチプレックスインデックスがあり、各マルチプレックスインデックスには複数のライブラリが含まれている可能性があります。

class MultiplexIndex(models.Model):
    multiplex_index_name = models.CharField(max_length = 100,   unique=True )
    multiplex_index_seq = models.CharField(max_length = 100,   null=True, blank=True) 
   def __unicode__(self):
        return  "%s (%s)" % ( self.multiplex_index_name , self.type.name)
    class Meta:
        ordering = ['multiplex_index_name']


class Library(models.Model):
    sample = models.ForeignKey(Sample, db_index=True)
    date_prepared = models.DateField(null=True, db_index=True )
    multiplex_index = models.ForeignKey(MultiplexIndex , null=True , blank=True)
    ...
    ...
    etc....

私のTastypieリソースはそのようなものです(私はさまざまな組み合わせを試しました):

class LibraryResource(ModelResource):
    sample = fields.ToOneField('sequencing.api.SampleResource', 'sample' )
    multiplexindex = fields.ToOneField('sequencing.api.MultiplexIndexResource' , 'multiplex_index'  , related_name='multiplexindex'  , null=True )  
    loadedwith_set = fields.ToManyField('sequencing.api.LoadedWithResource' ,    'loadedwith_set' , null=True)
    class Meta:
        queryset = Library.objects.all().order_by('-date_prepared')
        resource_name = 'library'
        paginator_class = Paginator
        serializer = PrettyJSONSerializer()
        filtering = {
            'sample': ALL_WITH_RELATIONS ,
            'multiplexindex' : ALL_WITH_RELATIONS , 
            'loadedwith' : ALL_WITH_RELATIONS , 
            'id' : ALL ,
            'name': ALL
        }


class MultiplexIndexResource(ModelResource):
    library = fields.ToManyField('sequencing.api.LibraryResource', attribute='library_set' ,    related_name='library' )
    class Meta:
        queryset = MultiplexIndex.objects.all()
        resource_name = 'multiplexindex'
        serializer = PrettyJSONSerializer()
        filtering = {
            'multiplex_index_name' : ALL ,
            'library' : ALL_WITH_RELATIONS , 
        }

「順方向」にきちんとフィルタリングできます。以下は、マルチプレックスインデックスが92hpのすべてのライブラリを返します。

http://127.0.0.1:8000/api/seq/library/?multiplexindex__multiplex_index_name=92hp&format=json

ただし、逆の関係でフィルターを実行しようとすると、常にエラーが発生します。DjangoクエリセットAPIでこれと同等のことをしたいと思います。

MultiplexIndex.objects.filter(library__name='515D')

だから私のURLは次のとおりです:

http://127.0.0.1:8000/api/seq/multiplexindex/?library__name=515D&format=json

この場合、エラーが発生します:キーワード'library_set'をフィールドに解決できません。

(これをライブラリに変更しようとしましたが、次のエラーが発生します:'MultiplexIndex'オブジェクトに属性'library'がありません)

MultiplexIndexResourceのattribute='library_set'が問題を引き起こしているようです。ライブラリセットに設定すると、関連するマネージャーが返されますが、フィルターは「library_set__name=515D」に設定されています。ライブラリに設定されている場合、MultiplexIndexテーブルにフィルタリングするフィールドはありません。

では、逆方向に機能するようにフィルタリングを設定する簡単な方法はありますか?私は何かが足りないのですか?

4

1 に答える 1

1

で、 kwargsとしてではなく、argsとしてMultipleIndexResource扱います。したがって、を次のようlibrary_setに置き換えattribute = 'library_set'ます。library_set

library = fields.ToManyField('sequencing.api.LibraryResource', 'library_set' , related_name='library')

必要に応じて追加full = Trueします。

于 2012-11-27T10:55:51.040 に答える