1. Bạn không thực sự nhận được bất kỳ thừa kế python, có nghĩa là bạn không thể kế thừa/phương pháp ghi đè hoặc các thuộc tính từ lớp mô hình Place
trong lớp học của bạn Restaurant
:
Ví dụ:
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
Điều này có nghĩa rằng để có được những name
của một nhà hàng, bạn không thể làm a_restaurant.name
, bạn sẽ cần phải làm theo các liên kết: a_restaurant.place.name
Cũng lưu ý rằng khi truy vấn một đối tượng Place
với liên quan Restaurant
.
a_restaurant.save()
Place.objects.get(pk=a_restaurant.pk) # won't work
Bạn sẽ phải viết:
a_restaurant.save()
Place.objects.get(restaurant__pk=a_restaurant.pk)
2 và 3. gần như giống nhau. Bạn nhận được sự thừa kế python thực với những điều này.
a_restaurant = Restaurant()
a_restaurant.get_x() # would actually work and print 'x'
lớp Mô hình của bạn Restaurant
thừa hưởng tất cả mọi thứ từ Place
: lĩnh vực người mẫu, các thuộc tính dụ/lớp bình thường, các nhà quản lý, phương pháp ... và bạn cũng có thể ghi đè lên hầu hết mọi thứ trong số này: Bạn không có thể ghi đè các thuộc tính lĩnh vực , điều đó không được hỗ trợ.
Vì vậy, bây giờ bạn có thể lấy giá trị của các trường từ mô hình gốc trực tiếp: a_restaurant.name
vì chúng được kế thừa.
Kể từ với những thực hiện một Restaurant
là một cũng Place
bạn có thể truy vấn cho một đối tượng Place
với Restaurant
dữ liệu:
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
Các chênh lệch giữa 2 và 3 là dễ dàng hơn để xem bạn đặt tên khác cho trường:
class Place(models.Model):
name = models.CharField(max_length=50)
class Restaurant(Place):
where = models.OneToOneField(Place, parent_link=True)
serves_pizza = models.BooleanField()
trình giống hệt nhau nhưng để có được những vị trí phụ huynh của Restaurant
tên thuộc tính là where
:
the_place = a_restaurant.where
với sẽ là:
the_place = a_restaurant.place_ptr
Những phương tiện đó place = models.OneToOneField(Place, parent_link=True)
sẽ chỉ thay đổi tên của liên kết đến cá thể mô hình gốc. Tên mặc định là '{lowercase_model_name}_ptr'
.
dụ cuối:
Với :
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]
Với 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]
Hy vọng những điều này sẽ giúp ích cho bạn. Nó phát triển một chút quá dài:/
Tôi muốn mở rộng các trang web được xây dựng trong khuôn khổ Mô hình trang web với các trường bổ sung và cố gắng quyết định phương pháp nào là tốt nhất. – kissgyorgy