2012-02-23 8 views
1

私のような外部キーを使用してモデルを参照する複数のDjangoのモデルがあります:モデルを参照するすべてのモデルをDjangoの1つのテーブルに結合するにはどうすればよいですか?

WorldGridだけである
class LocationHistory(models.Model): 
    region = models.ForeignKey(WorldGrid) 
    ... 

class UserSynthVals(models.Model): 
    region = models.ForeignKey(WorldGrid) 
    ... 

class RegionalVictoryRate(models.Model): 
    region = models.ForeignKey(WorldGrid) 
    ... 

class WorldGrid(models.Model): 
    latitude = models.FloatField() 
    longitude = models.FloatField() 
    ... 

は、私が(WorldGridを参照するすべてのモデルを取得することができています抽象的に再利用のための)と:。

models_that_reference = [i.model for i in get_model('appname',model_name)._meta.get_all_related_objects()] 

そして、その時点で、私はそれらを介してループが(自分のmodel.objects.allを取得することができます)の値()が、私はAWを見つけることができませんこれらのオブジェクトの別々のリストを1つのテーブルに結合してテーブルに出力することができます。

私はむしろ、djangoが期待している使い方(select_related()のような)に沿って何かを行い、この要約を残しておきたいと思います。

この問題を解決する助けがあれば、是非ともお試しください。

答えて

0

私はこれを行うにはかなり良い方法を見つけることができました。そして、select_relatedが本当にキーでした。その後、

fields_that_reference = [[m._meta.object_name.lower()+'__'+f.name for f in m._meta.fields if not isinstance(f,related.ForeignKey) ] for m in models_that_reference] 

for i in fields_that_reference: 
    fields +=i 

が、私は一度見しようとしているすべてのフィールドを取得するには、と::私は参照モデルのリストを持っていたら、私が行うことができます

all_objects = get_model('appname',model_name).objects.select_related().values(*fields) 

はそれらをすべて取得するには1つの巨大なリストに。あなたのモデルが歴史的(日時フィールドを持つ)であるか、または循環外的なキーを持っている場合は、表示する前にこの結果をもう少しプルーニングする必要があります。

0

私はフィルタでこれを行うことができると思います。 WorldGridに関連するモデルに参加し、参加していない場所を除外したいとします。

WorldGrid.objects.filter(regionalvictoryrate_region__isnull=False, 
         usersynthvals_region__isnull=False, 
         locationhistory_region__isnull=False) 

ここの注意を参照してください。 https://docs.djangoproject.com/en/dev/topics/db/queries/

+0

私はこれを試しました(usersynthvalsのみ)。そして、AttributeErrorを受け取りました。タイプオブジェクト 'UserSynthVals'に属性 'split'がありません。 – creatorjames

+0

奇妙なことに、ここで@creatorjamesを手伝ってください。私はあなたがモデルを使いたいなら、tihnkフィルターは行く方法です。もう一つの選択肢はモデルを完全に飛び越えて、間違ったエラーであると思われるSQL –

+0

の申し訳を使用して直接データをクエリすることです。地域の前にアンダースコアを追加することで答えを出すことができましたが、これはすべて、ユーザーシンセがあるWorldGridsを取得していると信じています。私が欲しいのは、同じテーブル内の参照するすべてのものです。 – creatorjames

0

は、過去に私が変更されていると、ちょうどそれをすべての関連するオブジェクトを返し、それらを表示したり、何らかの形でそれらを操作するdjango.contrib.admin.utilで、管理者からget_deleted_objects機能を果たしています。あなたが望むものを達成するには良いスタートになるかもしれません。

関連する問題