1

モデルを考えると:

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True)

class Thingie(models.Model):
    children = models.ManyToManyField('self', blank=True, symmetrical=False) 

class Relation(models.Model):
    profile = models.ForeignKey(Profile)
    thingie = models.ForeignKey(Thingie)

特定のThingieに関連するすべてのプロファイルインスタンスを含むQuerySetをどのように返すのでしょうか。つまり、リレーションから指定されたものを指す外部キーを持つすべてのプロファイル。

私はselect_related()についてすべて知っており、それを使用して反復することでこれを行う方法を知っていますが、反復することは苛立たしいことです(badoop bah!)。また、values_list()も調べられましたが、正しく機能していません。

助けてください!ありがとう!

4

3 に答える 3

2

クエリセットにする必要がありますか?反復可能である必要があるだけの場合、目的の簡単な式は次のとおりです。

profiles = [r.profile for r in thingie.relation_set.all()]

リスト内包表記が反復を刺激するものとしてカウントされるかどうかはわかりませんが、私にとってこれは完全に直感的な、Pythonのアプローチです。もちろん、それをクエリセットにする必要がある場合は、次の2つのクエリを使用してさらに厄介なことを行うことになります。

relation_values = thingie.relation_set.all().values_list('pk', flat=True)
profiles = Profile.objects.filter(relation__in=relation_values)

詳細については、「in」のドキュメントを参照してください。クエリセットが必要ない場合は、最初のアプローチをお勧めします。ああ、個別のプロファイルのみが必要な場合set(profiles)は、最初のアプローチを採用するかdistinct()、2番目のアプローチでquerysetメソッドを使用できます。

于 2009-09-09T02:55:40.570 に答える
0

ProfileとThingieの直接的な関係を定義しないと、定義できません。

最良の方法は、プロファイルを指すManyToManyをThingieに追加し、ManyToManyのthrough引数(django docs)を使用してリレーションモデル/テーブルを指定することです。

このようにして、Thingieで直接フィルター操作を実行して、プロファイルを取得し、中間のリレーションデータを保存できます。

于 2009-09-09T02:41:36.783 に答える
0

クエリの作成に関する Django のドキュメントを読みましたか? より具体的には、リレーションシップにまたがるルックアップを実現する簡単な例があります。ページの冒頭にあるモデル コードへの後者のリンクにあるコード スニペットを必ず参照してください。

于 2009-09-09T01:33:48.573 に答える