Django多表继承和模型创建

时间:2010-07-04 22:28:15

标签: django

我有一些代码遵循文档页面上给出的多表继承示例: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 个答案:

答案 0 :(得分:3)

不幸的是,像这样的模型“促销”是有问题的。正确的方法是通过复制Restaurant中的字段来创建新的Place对象。您必须通过迭代Place._meta.get_fields_with_model()并查看字段所属的模型来完成此操作。我无法为您提供确切的代码,但如果您可以使用GPL代码,那么自修订版bcd274ce7815以来它就在transifex.txcommon.models中。

答案 1 :(得分: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)

答案 2 :(得分: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

答案 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
)