2011-09-14 9 views
1

一意の(uuids)であるprimary_keysで複数のテーブルを照会する必要があります。Django:全モデルのpkによるクエリ

私の考えは、すべてのモデルを一度に照会するためにモデル継承を使用することでした。私はBaseItemを持っており、他のすべてのモデルはこのBaseItemモデルのサブクラスです。

私のクエリは、私が期待していたものを返さない。ここではサンプルモデルだ:私は=「1234」PKでNamedRevを作成し、

BaseRev.objects.get(pk="1234") 

のようなクエリを作成するとき

from django.db import models 
from django.contrib.auth.models import User 


class BaseRev(models.Model): 
    rev_id = models.CharField(max_length=32, primary_key=True) 
    item_id = models.CharField(max_length=32, blank=True, null=True) 
    creation_date = models.DateTimeField() 


class NamedRev(BaseRev): 
    name = models.CharField(max_length=64, blank=True, null=True) 
    description = models.CharField(max_length=256, blank=True, null=True) 
    creator = models.ForeignKey('UserProfile', related_name='namedrev_creator', blank=True, null=True) 

私は正しいPKで結果を得るが、それはタイプBaseItemのです。ドキュメントによると、rev_idフィールドはBaseRevテーブルにのみ存在し、NamedRevテーブルのNamedRevの追加フィールドには正しい動作が示されています。

どのようにして、特定のクエリに対してNamedRev型の(適切な)完全な(すべてのフィールドとともに)オブジェクトを取得できますか?

乾杯、

答えて

0

何が抽象的であるためにあなたの親クラスを設定した場合:

あなたBaseRevをフェッチした後
class BaseRev(models.Model): 
    rev_id = models.CharField(max_length=32, primary_key=True) 
    item_id = models.CharField(max_length=32, blank=True, null=True) 
    creation_date = models.DateTimeField() 

    class Meta: 
     abstract = True 
+0

これは私に属性エラー(名前はBaseRevからABaseRevに変更されました)を返します。AttributeError:タイプオブジェクト 'ABaseRev'には 'オブジェクト'属性がありません – Knack

0

は、実行します。

>>> base_rev = BaseRev.objects.get(pk="1234") 
>>> base_rev.namedrev 
<NamedRev: NamedRev object> 

割り当て上記を別の変数に渡すと、NamedRevのフィールドにアクセスできるはずです。

+0

達成しようとしていることを完全に理解していないので、NamedRev: .objects.get(pk = "1234") ' –

+0

私の目標は:私はID(ユニークなプライマリキー)を持っていて、対応するアイテム/テーブルのタイプを知らない。そのため、一致するオブジェクトが見つかるまで手動ですべてのテーブル/モデルをループすることができました。または、それは私の考えでした.Django ORMが派生テーブルを照会し、継承された型のオブジェクトを返すことを望むベーステーブルを照会します。しかし、Djangoは継承されたモデルの継承されたフィールドの列を作成しないので、基本的には基本表のみを照会します。すべてのテーブルを手動でループするのが一番簡単なようです... – Knack

0

ベースモデルに「タイプ」フィールドを挿入すると、ベースモデルを照会してそのタイプを尋ねることができます。各モデルのsave()メソッドをオーバーライドして保存する前にタイプを設定します。

関連する問題