1.実際にはPythonの継承は得られません。つまりPlace、クラスのモデルクラスからメソッドまたは属性を継承/オーバーライドすることはできませんRestaurant:
例えば:
class Place(models.Model):
name = models.CharField(max_length=50)
def get_x(self):
return 'x'
class Restaurant(models.Model):
place = models.OneToOneField(Place)
serves_pizza = models.BooleanField()
a_restaurant = Restaurant()
a_restaurant.get_x() # -> wouldn't work
これは、nameあなたができないレストランのを取得するa_restaurant.nameには、リンクをたどる必要があることを意味します:a_restaurant.place.name
Placeまた、関連するオブジェクトを照会する場合にも注意してくださいRestaurant。
a_restaurant.save()
Place.objects.get(pk=a_restaurant.pk) # won't work
あなたは書く必要があります:
a_restaurant.save()
Place.objects.get(restaurant__pk=a_restaurant.pk)
2および3。ほぼ同じです。これらを使用すると、実際の python 継承を取得できます。
a_restaurant = Restaurant()
a_restaurant.get_x() # would actually work and print 'x'
モデル クラスは、モデル フィールド、通常のインスタンス/クラス属性、マネージャー、メソッドなどRestaurantからすべてを継承しますPlace。また、これらのほとんどすべてをオーバーライドすることも
できます。フィールド属性をオーバーライドすることはできません。これはサポートされていません。
したがって、フィールドの値を親モデルから直接取得できるようになりましたa_restaurant.name。これらは継承されているためです。
これらの実装でRestaurant はa もであるため、データを含むオブジェクトをPlace照会できます。PlaceRestaurant
a_restaurant.save()
the_place = Place.objects.get(pk=a_restaurant.pk)
# ^ this works now and returns the equivalent `Place` instance.
the_same_restaurant = the_place.restaurant
フィールドに別の名前を付けると、2 と 3の違いがわかりやすくなります。
class Place(models.Model):
name = models.CharField(max_length=50)
class Restaurant(Place):
where = models.OneToOneField(Place, parent_link=True)
serves_pizza = models.BooleanField()
まったく同じように機能Restaurantしますが、属性名の親の場所を取得するにはwhere:
the_place = a_restaurant.where
2の場合は次のようになります。
the_place = a_restaurant.place_ptr
これらはplace = models.OneToOneField(Place, parent_link=True)、親モデル インスタンスへのリンクの名前のみを変更することを意味します。デフォルト名は です'{lowercase_model_name}_ptr'。
最後の例:
1 : _
place1 = Place.objects.create(name='place_1')
place2 = Place.objects.create(name='place_2')
restaurant1 = Restaurant.objects.create(place=place1, serves_pizza=True)
print Place.objects.all() # prints [place1, place2]
print Restaurant.objects.all() # prints [restaurant1]
2-3 : _
place1 = Place.objects.create(name='place_1')
place2 = Place.objects.create(name='place_2')
restaurant1 = Restaurant.objects.create(name='place_3', serves_pizza=True)
print Place.objects.all() # prints [place1, place2, place3]
print Restaurant.objects.all() # prints [restaurant1]
これらが役立つことを願っています。少し長くなりすぎます:/