2009-08-18 8 views
0

Previouslyは、この質問のより具体的なバージョンを求めていましたが、私の質問が何かを明確にするのに問題がありました。私の選択した解決策が問題に合っているかどうか疑問に思ったので、今度は問題を説明し、a)私が正しい道を歩いているかどうか、b)現在のレンガの壁の周りに道があるかどうかを尋ねます。余分なフィールドとの多対多の関係は私の仕事にとって正しいツールですか?

私は現在、(少数の)ユーザーによって既存のデータベースの問い合わせを可能にするWebインターフェイスを構築しています。私は1つの中央テーブル(ミュージシャン)とのForeignKeyまたはOneToOneFieldsいずれかによって関連している関連するデータの複数のテーブルを持っている

class Musician(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    dob = models.DateField() 

class Album(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 

class Instrument(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 

:ドキュメントからの類推にこだわって、私はこのような何かを見てモデルを持っています。ユーザは、フィルタリング基準を作成して、メインまたは関連するテーブル上のデータに基づいてミュージシャンのサブセットを選択することによって、データベースと対話する。同様に、ユーザは、提示される結果のランク付けに使用されるデータのピースを選択することができる。結果は、最初に、各列の選択されたデータフィールド(または集約)を持つミュージシャン1つ1つの行を持つ2次元テーブルとして表示されます。

スケールの考え方を示すために、データベースには約20フィールドの関連データを持つ約5,000人のミュージシャンがいます。

ここまでは問題ありません。ただし、あるユーザーが注釈データセットを複数アップロードして(複数の場合)、そのデータを既存のデータと同じ方法でフィルタリングして並べ替えることが重要です。

class UserDataSets(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    description = models.CharField(max_length=64) 
    results = models.ManyToManyField(Musician, through='UserData') 

class UserData(models.Model): 
    artist = models.ForeignKey(Musician) 
    dataset = models.ForeignKey(UserDataSets) 
    score = models.IntegerField() 

    class Meta: 
     unique_together = (("artist", "dataset"),) 

私はミュージシャンとの間に1人の関係に1から構成されたデータセットファイルをアップロードするユーザーを有効にする簡単なアップロードメカニズムを持っている:

私はこれを行うにしようとした方法は、モデルを追加しました彼らの "スコア"。所与のユーザデータセット内では、各アーティストはユニークであるが、異なるデータセットは互いに独立しており、同じミュージシャンのためのエントリを含むことが多い。

これは、私がこのような何かを行うことができます与えられたアーティストから始まる、データを表示するための罰金働いていた:私は、クエリセットのフィルタリングや順序付けを実装するために来たとき

artist = Musician.objects.get(pk=1) 
dataset = UserDataSets.objects.get(pk=5) 
print artist.userdata_set.get(dataset=dataset.pk) 

しかし、このアプローチは倒れました単一のユーザデータセットに含まれるデータに基づくミュージシャン。例えば、私は簡単にこのようなUserDataのテーブル内のすべてのデータに基づいてクエリセットを注文することができます:

artists = Musician.objects.all().order_by(userdata__score) 

をしかし、それは私に与えられた単一のユーザデータセットの結果によって順位を助けていません。同様に、異なるユーザーデータセットの「スコア」に基づいてクエリセットをフィルタリングする必要があります(たとえば、データセット1でスコア> 5、データセット2で< 2のすべてのミュージシャンを見つける)。

これを行う方法はありますか、それとも間違っているのですか?

答えて

0

編集:nevermind、間違っています。私はそれをあなたが読むことができるようにしておきますが、それから私は後で削除します。

こんにちは、

私が正しく理解していれば、あなたはこのような何か試すことができます:Complex lookups with Q objects:これをチェックし、Qを使用する方法の詳細について

artists = Musician.objects.select_related('UserDataSets').filter(Q(userdata__score_gt=5, userdata__id=1) | Q(userdata__sorce_lt=2, userdata__id=2) 

を。

関連する問題