【问题标题】:Django Model inheritance and access children based on categoryDjango模型继承和基于类别访问子项
【发布时间】:2017-02-11 16:27:10
【问题描述】:

我想获取每个子值的父类值?如何识别要获取的子对象?

我有这样的 Django 模型结构。

class Category(models.Model):
    name = models.CharField(max_length=80)


class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)
    category = models.ForeignKey('Category')


class PizzaRestaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)


class PastaRestaurant(Place):
    extra = models.CharField(max_length=80)

当我们进行操作时,我们可能会像下面这样保存对象。它按我的预期保存到数据库中。 Place 表中的两个条目和每个子对象表中的每个条目。

a = Category()
a.name = "pasta"

b = Category()
b.name = "pizza"

a.save()
b.save()

x = PastaRestaurant()
x.address = "Pasta Address"
x.name = "Pastamonia"
x.extra = "some extra"
x.category = a

y = PizzaRestaurant()
y.address = "Pizza Address"
y.name = "Dominos"
y.serves_hot_dogs = 1
y.serves_pizza = 0
y.category = b

x.save()
y.save()

现在我需要像这样访问

p = Place.objects.get(id=1)

我怎么知道哪些对象/属性属于地点对象? 因此,当我获取具有公共属性的位置时,也应该能够获取相应的子对象值。

或者我需要的任何其他模型设计工作?

【问题讨论】:

    标签: django python-2.7 django-models


    【解决方案1】:

    如果你想访问子模型的属性,你需要把它作为那个模型来获取,即PizzaRestaurantPastaRestaurant,否则你只会得到一个Place对象。

    如果您需要获取所有位置而不考虑子类,请查看来自django-model-utilsInheritanceManager。使用它,您可以实现重载操作以执行特定于子类的操作。

    【讨论】:

    • django-model-utils 支持 Django 1.4 到 1.9。它不适用于当前版本 1.10 吗?对于 Django 的新版本我们不知道这是有效的吗?
    • 我用 1.10 没有问题。
    【解决方案2】:

    django-polymorphic 做得很好,提高了使用模型继承的能力,如下所示:

    从 polymorphic.models 导入 PolymorphicModel

    class Place(PolymorphicModel):
        ...
    
    class PizzaRestaurant(Place):
        ...
    
    class PastaRestaurant(Place:
        ...
    
    
    >>> some_place = Place.objects.create(name="Walmart")
    >>> some_pizza_place = PizzaRestaurant.objects.create(name="Slice King", address="101 Main St., Bismarck, ND", category = Category.objects.first(),serves_pizza=True)
    >>> some_pizza_place.instance_of(PizzaPlace)
    True
    >>> PizzaRestaurant.objects.all()
    queryset<['Slice King',]>
    >>> Place.objects.all()
    queryset<['Walmart', 'Slice King',]>
    

    【讨论】:

    • 这将如何支持 django-rest 框架和序列化程序?
    猜你喜欢
    • 2015-03-05
    • 2017-07-11
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多