Django,如何知道孩子班级的确切类型(如果可能的话)

时间:2017-01-30 16:32:00

标签: python django django-models

这是我的models.py

class UserWidget(models.Model):
    user = models.ForeignKey(User, related_name="widgets")
    widget = models.ForeignKey(Widget)
    options = JSONField(default="{}")
    category = models.ManyToManyField(WidgetUserCategory)

class UserWidgetAtomic(UserWidget):
    atomic = models.ForeignKey(Atomic)

class UserWidgetNonAtomic(UserWidget):
    nonatomic = models.ForeignKey(NonAtomic)

在我的views.py上我这样做:

widgets = category.userwidget_set.all()

或者这(它没关系)

widgets = user.widgets.all()

我想在迭代子类对象的类型时知道(如果可能的话)。

例如

for item in widgets:
    if item.__class__.__name__ == "UserWidgetAtomic":
        do this
    elif item.__class__.__name__ == "UserWidgetNonAtomic":
        do that

这可能吗?怎么样?

1 个答案:

答案 0 :(得分:0)

这样做的必要性可能是表结构不合适的结果。

我的第一印象是UserWidgetUserWidget之间的关系。显而易见的是,它有两个外键。最好将该模型定义为itermediate many2many model

此外,字段category似乎放错地方了。由于它是一个很多关系,它的名字应该总是像categories。 可能它只是Widget模型上的外键。然后category会有意义。

您还创建了2个UserWidget的子类。这给处理它们带来了一些困难。如果您的所有用户小部件都属于UserWidgetAtomicUserWidgetNonAtomic类型,那么您应该将UserWidget模型设为摘要。您应该仔细检查multi-table-inheritance在您的情况下是否真的很麻烦,因为它会使事情变得更加复杂。