【问题标题】:Django Multi-Table inheritance and model creationDjango 多表继承和模型创建
【发布时间】:2011-03-11 17:22:20
【问题描述】:

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

我想为我的模型添加更多信息,所以我不想进去手动将所有字段设置为相等。有没有办法做到这一点?

【问题讨论】:

    标签: django


    【解决方案1】:

    不幸的是,像这样建模“促销”是有问题的。正确的方法是通过从Place 复制字段来创建一个新的Restaurant 对象。您必须通过迭代 Place._meta.get_fields_with_model() 并查看字段所属的模型来做到这一点。我不能给你确切的代码,但如果你可以使用 GPL 代码,那么它在 transifex.txcommon.models 中,因为修订版 bcd274ce7815。

    【讨论】:

    【解决方案2】:

    我认为你应该像这样向餐厅添加一个外键:

    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)
    

    【讨论】:

    • 模型继承将隐式 OneToOne 从子级添加到父级。但你已经接近了。
    【解决方案3】:

    我遇到了同样的问题。我想我找到了一个很好的解决方案:

    我使用如下三个类定义了我的餐厅模型:

    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
    

    【讨论】:

      【解决方案4】:

      正如我回答了我自己的问题here

      我最终做了一些类似的事情

      p = Place.objects.get(name="Bob's Cafe")
      Restaurant.objects.create(
          place_ptr = p.id,
          serves_hot_dogs = True,
          serves_pizza = False
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多