我有一些代码遵循文档页面上给出的多表继承示例: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'
我想向我的模型添加更多信息,所以我不想进入并手动将所有字段设置为相等。无论如何要做到这一点?
答案 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
)