2017-01-30 3 views
0

это мой 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

Somthing like 'if isinstance (item, UserWidgetAtomic): ...' https://docs.python.org/2/library/functions.html#isinstance – allcaps

+0

Да, но это не работает. Хотя isinstance (item, UserWidget) дает мне True, isinstance (item, UserWidgetAtomic) дает мне False – xpanta

+0

Я думаю, что структура таблицы слишком сложна. Мне кажется, что 'UserWidget' следует использовать как промежуточную модель many2many. Не могли бы вы добавить свою модель «Atomic» и «NonAtomic» к вашему вопросу? Кроме того, '' '' кажется неуместным на модели 'UserWidget'. Это очень много, поэтому имя должно быть «категориями». – trixn

ответ

0

Необходимо сделать это, вероятно, из-за неподходящей структуры таблицы.

Мое первое впечатление заключается в том, что UserWidget является отношением между User и Widget. Очевидным признаком этого является то, что у него есть внешние ключи для обоих. Вероятно, лучше определить эту модель как itermediate many2many model.

Кроме того, поле category кажется неуместным. Так как это многозначное отношение, это имя всегда должно быть чем-то вроде categories. Наверное, это просто внешний ключ на модели Widget. Тогда смысл будет иметь значение category.

Также вы создали 2 подкласса UserWidget. Это приводит к некоторым трудностям с их обработкой. Если все ваши пользовательские виджеты имеют тип UserWidgetAtomic или UserWidgetNonAtomic, вы должны сделать свой анкет модели UserWidget. Вы должны проверить, действительно ли multi-table-inheritance действительно в вашем случае, потому что это может усложнить ситуацию.

 Смежные вопросы

  • Нет связанных вопросов^_^