ユーザーが評価する必要のあるファイルを持っている単純なモデルがあります。Django/tastypie を使用しています。
[models.py]
class User( models.Model ):
[..]
class File( models.Model ):
[..]
bVerified = models.IntegerField(blank=True, null=True, )
class UserFile( models.Model ):
[..]
nRate = models.CharField( max_length=4)
user = models.ForeignKey( User, related_name="userfile" )
file = models.ForeignKey( File, related_name="userfile" )
[api.py]
class UserFileResource( MyModelResource ) :
user = fields.ToOneField( 'app.api.UserResource','user',full=True,null=True)
file = fields.ToOneField( 'app.api.FileResource','file',full=True,null=True)
class Meta:
queryset = UserFile.objects.all()
resource_name = 'userfile'
filtering = {
"id" : ALL,
"file" : ALL_WITH_RELATIONS,
"user" : ALL_WITH_RELATIONS,
}
def apply_filters(self, request, applicable_filters):
oBaseObject = super( UserFileResource, self ).apply_filters( request, applicable_filters )
loQ = []
idUser = str( request.user.id )
loQ.append( Q( **{ 'user__id__exact' : idUser } ) )
loQ.append( Q( **{ 'file__bVerified__exact' : 1 } ) )
oFilter = reduce( operator.and_, loQ )
oBaseObject = oBaseObject.filter( oFilter )
return oBaseObject
上記のコードでは、これが現在取得している結果セット、つまりすべての (john の) ファイルです。
{
"meta": { "limit": 10, "next": null, "offset": 0, "previous": null, "total_count": 3 },
"objects": [
{
"id": 1,
"nRate" : 5,
"file": { "name": "test1.txt", "bVerified": 1 },
"user": { "id": 1, "name": "john" }
},
{
"id": 2,
"nRate" : 3,
"file": { "name": "test2.txt", "bVerified": 1 },
"user": { "id": 1, "name": "john" }
},
{
"id": 3,
"nRate" : 4,
"file": { "name": "test3.txt", "bVerified": 1 },
"user": { "id": 1, "name": "john" }
}
]
}
ここで、定義済みのユーザーを使用して 3 つの「集合論」クエリを作成したいと考えています。私 (John) は自分のファイルを他の 2 人のユーザー (Tim と Tom) と比較したい
これらは、3 種類のクエリで取得したい結果です。
私 (ジョン) だけが持っているファイル:
{
"meta": { "limit": 10, "next": null, "offset": 0, "previous": null, "total_count": 1 },
"objects": [
{
"id": 3,
"file": { "name": "test3.txt", "bVerified": 1 },
"user": [
{ "id": 2, "name": "john", "nRate" : 4 }
]
}
]
}
私 (ジョン) は持っていないが、他の人 (ティムとトム) は持っているファイル:
{
"meta": { "limit": 10, "next": null, "offset": 0, "previous": null, "total_count": 2 },
"objects": [
{
"id": 23,
"file": { "name": "test42.txt", "bVerified": 1 },
"user": [
{ "id": 2, "name": "tom", "nRate" : 7 },
{ "id": 3, "name": "tim", "nRate" : 7 }
]
},
{
"id": 24,
"file": { "name": "test43.txt", "bVerified": 1 },
"user": [
{ "id": 2, "name": "tom", "nRate" : 7 },
{ "id": 3, "name": "tim", "nRate" : 7 }
]
}
]
}
私たち全員が持っているファイル:
{
"meta": { "limit": 10, "next": null, "offset": 0, "previous": null, "total_count": 1 },
"objects": [
{
"id": 1,
"file": { "name": "test1.txt", "bVerified": 1 },
"user": [
{ "id": 1, "name": "john", "nRate" : 5 },
{ "id": 2, "name": "tom", "nRate" : 4 },
{ "id": 3, "name": "tim", "nRate" : 7 }
]
}
]
}
誰かがすでにこのようなことをしたか、いくつかのアプローチを共有できますか?