2012-03-22 31 views
20

Tôi đang sử dụng multi-table-inheritance và muốn biết cách tạo loại được kế thừa từ một thể hiện của lớp cha.Thừa kế mô hình Django: Tạo một lớp con bằng cách sử dụng siêu lớp hiện có

Sử dụng ví dụ được đưa ra trong tài liệu hướng dẫn:

class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 

class Restaurant(Place): 
    serves_hot_dogs = models.BooleanField() 
    serves_pizza = models.BooleanField() 

Bây giờ khi bạn tạo ra một Restaurant, bạn sẽ tự động tạo ra một Place, đó là tốt, và hành vi tôi mong đợi và muốn.

Nhưng nếu tôi thực hiện Place và sau đó quyết định tôi muốn chuyển đổi thành một loại cụ thể (như Restaurant). Làm thế nào để bạn tạo một Restaurant, sử dụng Place hiện có?

+3

thể trùng lặp của [Django mô hình thừa kế: tạo tiểu thẩm thẩm (nhìn xuống) hiện] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create- sub-instance-of-existing-instance-downcast) – jpic

+0

Tôi thấy câu hỏi và câu trả lời đó, nhưng đã bị nhầm lẫn bởi vì tôi nghĩ rằng vấn đề đó phải làm với xác thực (vì một Người dùng hơi hơn một đối tượng đặc biệt) –

+0

Tôi upvoted nhận xét trùng lặp, tuy nhiên ... câu hỏi đề cập đến là về Người dùng, điều này có thể gây nhầm lẫn. Tôi tìm thấy ví dụ này về địa điểm và nhà hàng (bị đánh cắp từ Tài liệu Django) rõ ràng hơn và giống với vấn đề của tôi .... nhưng trong cơ sở đó là cùng một vấn đề. –

Trả lời

26

Thừa kế nhiều bảng chỉ là OneToOneField mối quan hệ giữa Địa điểm và Nhà hàng.

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

# Create a restaurant using existing Place 
restaurant = Resturant(place_ptr=place) 
restaurant.save() 
+9

Điều này sẽ làm cho tên nhà hàng bị trống. Bởi vì restaurant.save() sẽ cập nhật Địa điểm với tên = '' (vì nhà hàng = Resturant()) ... phải có cách tốt hơn ... – jpic

+10

Bạn nên thêm nhà hàng .__ dict __. Update (place .__ dict__), xem [Câu trả lời của Daniel Roseman] (http://stackoverflow.com/questions/4064808/django-model-inheritance-create-sub-instance-of-existing-instance-downcast). – jpic

+1

Ok, sự kết hợp của câu trả lời của secator và bổ sung của jpic làm các trick ... –

9
place = Place.objects.get(id=1) 

# Create a restaurant using existing Place 
place.__class__ = Restaurant 
place.save() 
restaurant = place 
Các vấn đề liên quan