2016-10-03 10 views
1

私は各子値で親クラスの値を取得したいですか?フェッチする子オブジェクトをどのように識別できますか?Djangoモデルの継承とカテゴリに基づく子へのアクセス

私はこのようなDjangoモデル構造を持っています。

class Category(models.Model): 
    name = models.CharField(max_length=80) 


class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 
    category = models.ForeignKey('Category') 


class PizzaRestaurant(Place): 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 


class PastaRestaurant(Place): 
    extra = models.CharField(max_length=80) 

私たちは操作をするとき、以下のようにオブジェクトを保存することができます。それは私が期待したようにDBに保存されました。 Placeテーブルの2つのエントリと各子オブジェクトテーブルの各エントリ。

a = Category() 
a.name = "pasta" 

b = Category() 
b.name = "pizza" 

a.save() 
b.save() 

x = PastaRestaurant() 
x.address = "Pasta Address" 
x.name = "Pastamonia" 
x.extra = "some extra" 
x.category = a 

y = PizzaRestaurant() 
y.address = "Pizza Address" 
y.name = "Dominos" 
y.serves_hot_dogs = 1 
y.serves_pizza = 0 
y.category = b 

x.save() 
y.save() 

は今、私は場所オブジェクトに/オブジェクトの属性私が知ることができますどのようにこの

p = Place.objects.get(id=1) 

、などの所属にアクセスする必要がありますか? 共通の属性を持つ場所を取得するときに、対応する子オブジェクトの値も取得できる必要があります。

私の必要性のための他のモデル設計の仕事ですか?

答えて

1

子モデルの属性にアクセスするには、そのモデルとして取得する必要がある場合は、PizzaRestaurantまたはPastaRestaurantです。そうでない場合はPlaceオブジェクトのみが取得されます。

サブクラスに関係なくすべてのプレイスを取得する必要がある場合は、django-model-utilsからInheritanceManagerをご覧ください。これを使用すると、オーバーロードされた操作を実装して、サブクラス固有のアクションを実行できます。

+0

ジャンゴモデル-utilsのをインポートすると、1.9を通じてDjangoの1.4をサポートしています。現在のリリース1.10ではありませんか? Djangoの新しいリリースのためにこれは仕事であるとは知らないのですか? –

+0

問題なく1.10で使用します。 –

1

django-polymorphicこれは美しく、そのようなモデルの継承と連携する能力を向上さん:polymorphic.modelsから

がPolymorphicModel

class Place(PolymorphicModel): 
    ... 

class PizzaRestaurant(Place): 
    ... 

class PastaRestaurant(Place: 
    ... 


>>> some_place = Place.objects.create(name="Walmart") 
>>> some_pizza_place = PizzaRestaurant.objects.create(name="Slice King", address="101 Main St., Bismarck, ND", category = Category.objects.first(),serves_pizza=True) 
>>> some_pizza_place.instance_of(PizzaPlace) 
True 
>>> PizzaRestaurant.objects.all() 
queryset<['Slice King',]> 
>>> Place.objects.all() 
queryset<['Walmart', 'Slice King',]> 
+0

これはdjango-restフレームワークとシリアライザでどのようにサポートされますか? –

関連する問題