Django Multi-Table наследование и создание модели - PullRequest
3 голосов
/ 05 июля 2010

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

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

>>> 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'

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

Ответы [ 4 ]

3 голосов
/ 05 июля 2010

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

1 голос
/ 17 августа 2014

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

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

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
1 голос
/ 05 июля 2010

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

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)
0 голосов
/ 27 февраля 2018

Как я ответил на свой вопрос здесь ,

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

p = Place.objects.get(name="Bob's Cafe")
Restaurant.objects.create(
    place_ptr = p.id,
    serves_hot_dogs = True,
    serves_pizza = False
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...