这是我的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
这可能吗?怎么样?
答案 0 :(得分:0)
这样做的必要性可能是表结构不合适的结果。
我的第一印象是UserWidget
是User
和Widget
之间的关系。显而易见的是,它有两个外键。最好将该模型定义为itermediate many2many model。
此外,字段category
似乎放错地方了。由于它是一个很多关系,它的名字应该总是像categories
。
可能它只是Widget
模型上的外键。然后category
会有意义。
您还创建了2个UserWidget
的子类。这给处理它们带来了一些困难。如果您的所有用户小部件都属于UserWidgetAtomic
或UserWidgetNonAtomic
类型,那么您应该将UserWidget
模型设为摘要。您应该仔细检查multi-table-inheritance在您的情况下是否真的很麻烦,因为它会使事情变得更加复杂。