2

querySet全体でForeignKey関係を逆方向に追跡することは可能ですか?

私はこのようなものを意味します:

x = table1.objects.select_related().filter(name='foo')
x.table2.all()

table1がtable2にForeignKeyを持っている場合。

https://docs.djangoproject.com/en/1.2/topics/db/queries/#following-relationships-backwardで 、get()でのみ機能し、filter()では機能しないことがわかります。

ありがとう

4

3 に答える 3

6

基本的にQuerySet、最初のデータとは異なるタイプを取得する必要があります。

class Kid(models.Model):
    mom = models.ForeignKey('Mom')
    name = models.CharField…

class Mom(models.Model):
    name = models.CharField…

。という名前の息子を持つすべてのお母さんを取得したいとしますJohnny

Mom.objects.filter(kid__name='Johnny')

のすべての子供を取得したいとしますLucy

Kid.objects.filter(mom__name='Lucy')
于 2012-11-22T08:57:58.017 に答える
1

次のようなものを使用できるはずです。

for y in x:
y.table2.all()

ただし、クエリを使用して一意の値を見つけた後get()、一意の値のリストに使用することもできます(別の値を指定しない限り、これはになります)。id

それで、

x = table1.objects.select_related().filter(name='foo')
for y in x:
   z=table1.objects.select_related().get(y.id)
   z.table2.all()

また動作するはずです。

于 2012-11-22T07:56:10.890 に答える
1

values()外部キー参照の特定の値をフェッチするために使用することもできます。valuesDBのselectクエリを使用すると、これらの値のみをフェッチするように削減され、適切な結合が実行されます。

Krzysztof Szularzの例を再利用するには:

jonny_moms = Kid.objects.filter(name='Jonny').values('mom__id', 'mom__name').distinct()

これにより、KidQueryManagerを使用してMom属性のディクショナリが返されます。

于 2014-10-27T16:39:08.160 に答える