我需要通过两个字段的内容迭代一组模型对象。代码可能更有意义。
这是我的模型定义:
class Widget(models.Model):
group = models.ForeignKey(WidgetGroup)
style = models.CharField(max_length=40, blank=True)
我想对同一组和样式的小部件采取行动,因此我使用以下代码。它有效,但看起来并不整洁。足够典型的python和Django。有没有更好的方法呢?
widgets = Widget.objects.all()
for group in WidgetGroup.objects.all():
group_widgets = widgets.filter(group=group)
for style in set(group_widgets.values_list('style', flat=True)):
group_style_widgets = group_widgets.filter(style=style)
# Do something with group_style_widgets
编辑: 对我很重要,我首先按组进行迭代,然后再进行样式。想想像Markdown这样的预期输出:
# Group1
## Style1
## Style2
# Group2
## Style2
## Style3
答案 0 :(得分:0)
我认为你正在寻找这样的东西:
for group in WidgetGroup.objects.prefetch_related('widget_set').all():
for group_style_widgets in group.widget_set.all():
# Do something with group_style_widgets
或者如果您想特别使用这些样式:
styles = Widget.objects.all().values_list('style', flat=True).distinct()
for group in WidgetGroup.objects.prefetch_related('widget_set').all():
for style in styles:
group_style_widgets = group.widget_set.filter(style=style)
# Do something with group_style_widgets