我有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 queryset API中做相同的操作。
MultiplexIndex.objects.filter(library__name='515D')
所以我的网址如下:
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表上没有要过滤的字段。
有没有一种简单的方法来设置过滤,以便它可以反向工作?我错过了什么吗?
答案 0 :(得分:1)
在MultipleIndexResource
上,不要将library_set
视为kwargs,而应视为args。因此,请将attribute = 'library_set'
替换为library_set
,如下所示:
library = fields.ToManyField('sequencing.api.LibraryResource', 'library_set' , related_name='library')
如果需要,请添加full = True
。