2010-07-04 2 views
3

У меня есть код, который следует примеру для наследования нескольких таблиц, как указано на странице документации: http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance. То, что я пытаюсь сделать, это создать ресторан вокруг места.Наследование наложения и создания Django Multi-Table

Я уже создал место, и я хочу сделать ресторан на это так:

>>> p = Place.objects.get(id=12) 
# If p is a Restaurant object, this will give the child class: 
>>> p.restaurant 
<Restaurant: ...> 
>>> r = Restaurant(p) 

но я получаю эту ошибку:

TypeError: int() argument must be a string or a number, not 'Place' 

Я хочу, чтобы добавить больше информация для моих моделей, поэтому я не хочу входить и вручную устанавливать все поля равными. Есть какой-либо способ сделать это?

ответ

1

Я думаю, вы должны добавить внешний ключ в ресторан так:

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

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

, а затем вы можете сделать:

>>> p = Place.objects.get(id=12) 
>>> r = Restaurant(place=p) 
+1

модели наследования добавляет неявное OneToOne от ребенка к родителю. Но ты рядом. –

3

К сожалению модель «продвижение», как это проблематично. Правильный способ - создать новый объект Restaurant, скопировав поля с Place. Вы должны сделать это, итерации через Place._meta.get_fields_with_model() и видя, к какой модели принадлежат поля. Я не могу дать вам точный код для этого, но если вы можете жить с кодом GPLed, то он находится в transifex.txcommon.models с ревизии bcd274ce7815.

+0

любой шанс, что вы можете предоставить ссылку на что-нибудь? – Fred

+0

http://code.transifex.org/index.cgi/mainline/file/a9f391a5c9b8/transifex/txcommon/models.py#l62 – zellyn

1

Я столкнулся с той же проблемой. Я думаю, что я нашел хорошее решение:

Я определил свою модель ресторана, используя три класса, как это:

class RestaurantBase(models.Model): 
    class Meta: 
     abstract = True 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 

class Restaurant(Place, RestaurantBase): 
    pass 

class RestaurantStandalone(RestaurantBase): 
    class Meta: 
     managed = False 
     db_table = Restaurant._meta.db_table 
    place_ptr = models.OneToOneRelationship(Place) 

Теперь, если у меня есть место, которое я хочу обновить до ресторана, я следующее:

p = Places.objects.get(id=3) 
r = RestaurantStandalone() 
r.place_ptr = p 
r.save() 

теперь ваше место ресторан

r = Restaurant.objects.filter(place_ptr=p) 
print(r.id) 
>>3 
0

Как я ответил м у собственного вопрос here,

Я закончил тем, что делал что-то вдоль линий

p = Place.objects.get(name="Bob's Cafe") 
Restaurant.objects.create(
    place_ptr = p.id, 
    serves_hot_dogs = True, 
    serves_pizza = False 
) 
Смежные вопросы